请考虑以下代码:
function A() {}
A.prototype.go = function() {
console.log(this); //A { go=function()}
var f = function() {
console.log(this); //Window
};
f();
}
var a = new A();
a.go();
为什么函数'f'中的'this'指的是全局范围?为什么它不是函数'A'的范围?
答案 0 :(得分:35)
JavaScript对特殊名称this
所指的内容有不同的概念
比大多数其他编程语言。确切地说五不同
this
的值可以用语言绑定的方式。
this;
在全局范围内使用this
时,它只会引用全局对象。
foo();
此处,this
将再次引用全局对象。
ES5注意:在严格模式下,全局案例不再存在。 在这种情况下,
this
的值将为undefined
。
test.foo();
在此示例中,this
将引用test
。
new foo();
以new
关键字开头的函数调用充当
构造函数。在函数内部,this
将引用
到新创建的 Object
。
this
function foo(a, b, c) {}
var bar = {};
foo.apply(bar, [1, 2, 3]); // array will expand to the below
foo.call(bar, 1, 2, 3); // results in a = 1, b = 2, c = 3
使用call
的{{1}}或apply
方法时,值为。{
被调用函数内的Function.prototype
将显式设置添加到第一个参数
相应的函数调用。
因此,在上面的示例中,方法案例 不适用,this
this
内的内容将设置为foo
。
注意:
bar
无法用于引用this
内的对象 文字。因此Object
将不导致var obj = {me: this}
引用me
,因为obj
仅受列出的五个案例之一的约束。
虽然大多数情况都有意义,但第一种情况应被视为另一种情况 错误设计语言因为从不有任何实际用途。
this
一个常见的误解是Foo.method = function() {
function test() {
// this is set to the global object
}
test();
}
内的this
指的是test
;而在
事实上,不。
要从Foo
内获取对Foo
的访问权限,必须创建一个
test
内的局部变量,指的是method
。
Foo
Foo.method = function() {
var that = this;
function test() {
// Use that instead of this here
}
test();
}
只是一个普通的变量名,但它通常用于引用
外that
。与封闭相结合,它也可以
用于传递this
值。
在JavaScript中不工作的另一件事是函数别名,即 为变量分配方法。
this
由于第一种情况,var test = someObject.methodTest;
test();
现在就像一个普通的函数调用;因此,
其中的test
将不再引用this
。
虽然someObject
的后期绑定起初可能看起来不是一个坏主意,但是
事实上,它是原型继承工作的原因。
this
在function Foo() {}
Foo.prototype.method = function() {};
function Bar() {}
Bar.prototype = Foo.prototype;
new Bar().method();
的实例上调用method
时,Bar
现在会引用该this
非常实例。
免责声明: http://bonsaiden.github.com/JavaScript-Garden/#function.this
从我自己的资源中偷走了无耻答案 1 :(得分:1)
您之所以将f
作为function
而不是method
进行调用。在函数this
中调用时,在执行目标
window
// Method invocation. Invoking a member (go) of an object (a). Hence
// inside "go" this === a
a.go();
// Function invocation. Invoking a function directly and not as a member
// of an object. Hence inside "f" this === window
f();
// Function invocation.
var example = a.go;
example();
答案 2 :(得分:1)
所有功能的范围是window
。
为了避免这种情况,你可以这样做:
function A() {}
A.prototype.go = function() {
var self = this;
console.log(self); //A { go=function()}
var f = function() {
console.log(self); //A { go=function()}
};
f();
}
答案 3 :(得分:1)
因为没有任何对象引用而不调用函数f()
。尝试,
f.apply(this);