Gre*_*g K 2 javascript jquery scope anonymous-function
如本博文中所述,您可以this在Javascript中设置匿名函数的范围.
在AJAX请求this的匿名函数调用中是否有更优雅的方法作用success(即不使用that)?
例如:
var Foo = {
bar: function(id) {
var that = this;
$.ajax({
url: "www.somedomain.com/ajax_handler",
success: function(data) {
that._updateDiv(id, data);
}
});
},
_updateDiv: function(id, data) {
$(id).innerHTML = data;
}
};
var foo = new Foo;
foo.bar('mydiv');
Run Code Online (Sandbox Code Playgroud)
使用调用但仍必须命名父对象范围that.
success: function(data) {
(function() {
this._updateDiv(id, data);
}).call(that);
}
Run Code Online (Sandbox Code Playgroud)
在jQuery 1.4中你有$.proxy方法,你可以简单地写:
//...
bar: function(id) {
$.ajax({
url: "someurl",
success: $.proxy(this, '_updateDiv')
});
},
//...
Run Code Online (Sandbox Code Playgroud)
$.proxy获取一个对象,该对象将用作this值,它可以采用字符串(该对象的成员)或函数,它将返回一个始终具有特定范围的新函数.
另一个替代方案是bind功能,现在ECMAScript第五版标准的一部分是最好的:
//...
bar: function(id) {
$.ajax({
url: "someurl",
success: function(data) {
this._updateDiv(id, data);
}.bind(this)
});
},
//...
Run Code Online (Sandbox Code Playgroud)
当JavaScript引擎完全实现ES5标准时,此功能将很快本地提供,目前,您可以使用以下8行长实现:
// The .bind method from Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
Run Code Online (Sandbox Code Playgroud)
该$.ajax()函数提供了一种简洁的方法,以context参数的形式执行此操作:
$.ajax({
url: "www.somedomain.com/ajax_handler",
context: this,
success: function(data) {
this._updateDiv(id, data);
}
});
Run Code Online (Sandbox Code Playgroud)
虽然CMS概述的技术更适合一般用途.
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |