我正在调用以下第三方JavaScript函数:
var Socket = function(url) {
sockets.push(this);
var me = this;
me.readyState = 0;
window.setTimeout(function() {
me.readyState = 1;
me.onopen();
}, 500);
};
通过这个:
connection = new Socket(socketURL);
现在我想尝试一劳永逸地理解在函数中引用this
的含义。它与Java中的相同吗?例如我指的是我自己,或者在JavaScript的情况下,我指的是函数所在的命名空间?
答案 0 :(得分:3)
this
的引用取决于你如何调用该函数。
例如:
function globalFn() { return this.val; }
var objectA = { val: 1, localFn: globalFn };
var objectB = { val: 2, localFn: globalFn };
objectA.localFn(); // `this` will be `objectA`, so it returns `1`.
objectB.localFn(); // `this` will be `objectB`, so it returns `2`.
到目前为止,这么好。它看起来与Java或其他面向对象语言中的相同。但是,这看起来似乎很棘手:
var myFn = objectA.localFn;
myFn(); // `this` will be `undefined` in strict mode, causing an error
这表明this
引用不是绑定到函数本身,而是绑定到函数的调用方式。您可以使用函数对象的call
方法“欺骗”它:
myFn.call(objectA); // `this` will be `objectA`, returns `1`.
globalFn.call(objectB); // `this` will be `objectB`, returns `2`.
objectA.localFn.call(objectB); // `this` will be `objectB`, returns `2`.
您甚至可以为没有定义为属性的函数的对象执行此操作:
var objectC = {val: 3};
myFn.call(objectC); // `this` will be `objectC` and will return `3`.
起初很难理解它,有一个很棒的视频可以说明它在YouTube上是如何运作的:James Shore The Definitive Guide to Object-Oriented JavaScript。
答案 1 :(得分:0)
编辑。以前的答案不正确。这是一个很好的解释:
code.tutsplus.com/tutorials/fully-understanding-the-codethiscode-keyword--net-21117