javascript:“;这个“;在内部功能中
javascript: "this" in an inner function
我之前在jquery的上下文中发布了一个类似的问题,但jquery对this
的内部处理混淆了问题。因此,为了保持简单明了,请考虑:
function someCallbackFunction() {
this.name = "Tom";
}
anObject.method(someCallbackFunction);
当被"anObject"调用时,someCallbackFunction
的"this"指向什么?
也就是说,当一个对象(在其函数内)调用函数"some callback function"时,(内部)"some回调函数"的"this"指向什么?[不是"outer"的"this"(AnObject.function-当用call或apply调用时,它当然指向AnObject或另一个调用函数)]
我认为它应该指向全局对象(window
对象),因为闭包内的this
将指向全局DOM window
对象(在非严格模式下)或是undefined
(在严格模式中)。
this
取决于函数的调用方式。如果像mycallback()
一样调用它,那么this
将引用window
对象。如果您用mycallback.call(object)
(或apply
)来称呼它,this
将指代object
。
http://jsfiddle.net/ydqZ8/1/
function callback()
{
alert(this.toto);
}
window.toto = 0;
var obj = {
toto : "TOTO"
};
callback(); // displays 0
callback.call(obj); // displays TOTO
试试这个:
var self = this;
some callback function () {
self.name = "Tom";
}
Object.function (some callback function);
通常'this'指向托管所调用方法的对象。(您可以通过函数.call(thisObject,arg1,arg2)或功能.apply(thisObject,[argList])来覆盖此项。)
一个简单的例子:
var myObject = {
value: 1,
report: function() {
return "value: " + this.value;
}
}
console.log( myObject.report() ); // "value: 1"
应该很清楚。
使用构造函数和原型,它将是:
function Reporter(v) {
this.value = v;
}
Reporter.prototype = {
report: function() { return "value: " + this.value; }
};
var myObject = new Reporter(1);
console.log( myObject.report() ); // "value: 1"
效果一样。"this'是通过调用"new Reporter(1)"创建的对象,原型中的this'指的是调用方法"report()"的对象。(只有在"myObject"中没有定义方法"report()"作为自己的属性的情况下,原型才会发挥作用。)
现在有点嵌套:
function ComplexReporter(v) {
this.value = v;
}
ComplexReporter.prototype = {
report: function() { return "value: " + this.value; },
utils: {
innerReport: function() { return "value: " + this.value; }
}
};
var myObject = new ComplexReporter(1);
console.log( myObject.report() ); // "value: 1"
console.log( myObject.utils.innerReport() ); // "value: undefined"
第一个调用与上面一样,并提供了预期的结果。
在第二个调用中,"this"不是预期的"myObject",而是"myObject.protype.utils",它没有任何类型的属性@value。这实际上是
ComplexReporter.prototype.utils.innerReport.apply( myObject.prototype.utils, [] );
因此,根据经验,"this"是在点表示法中调用对象的方法时,由最后一个点之前的最后一个标识符的路径描述的实体。
最后一个没有原型的例子(再次简单一点):
var myComplexObject = {
value: 1,
report: function() {
return "value: " + this.value;
},
utils: {
innerReport: function() {
return "value: " + this.value;
}
}
}
console.log( myComplexObject.report() ); // "value: 1"
console.log( myComplexObject.utils.innerReport() ); // "value: undefined"
// same as myComplexObject.utils.innerReport.apply( myComplexObject.utils, [] );
console.log( myComplexObject.utils.innerReport.apply( myComplexObject, [] ) ); // "value: 1"
和:"this"总是在调用函数的那一刻求值(因此在构造闭包时无法保存"this"的上下文含义)。
我希望,这些例子有助于理解"这"是如何工作的。。。
附言:如果提供了对function.call()或function.apply()的调用的this对象是未定义或者为null,则全局对象("self",在与"window"相同的浏览器中)将用作"this"。
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 在内部映射值时渲染方法中断
- 按下一个HTML按钮,该按钮使用一个功能在同一个新窗口中打开URL
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- jQuery点击功能在获取请求后不起作用
- 点击功能在<span>
- 以下颜色更改功能在IE9和Firefox中运行良好,但在早期的IE或Chrome中则不然
- 如何在内部脚本完全加载后运行脚本
- 在内部JavaScript函数中包含外部对象
- JS Promises如何在内部工作
- V8中如何在内部表示对象
- 为什么这个排序功能在 Safari 中不起作用
- 控制器功能在 Angular.js 中不起作用
- ScriptX 打印功能在 IE8 中不起作用
- 石头剪刀布游戏功能在Javascript
- JavaScript 在内部函数中保留一个 var
- 功能在3秒钟后返回
- javascript:“;这个“;在内部功能中
- Javascript:在内部站点中添加搜索功能
- 如何在内部功能测试中使用dijit/ registry ?