Javascript";这";作用域根据其调用方式给出不同的结果
全部, 代码如下:Javascript";这";作用域根据其调用方式给出不同的结果,javascript,scope,this,Javascript,Scope,This,全部, 代码如下: var Person = function (name) { this.name = name; this.printName = function(){ console.log("My name is " + this.name); } }; var p = new Person("Steve"); var funcRef = p["printName"]; p.printName();//Works p["printName"]();/
var Person = function (name) {
this.name = name;
this.printName = function(){
console.log("My name is " + this.name);
}
};
var p = new Person("Steve");
var funcRef = p["printName"];
p.printName();//Works
p["printName"]();//Works
funcRef();//returns incorrect value
在此处找到一个工作示例:
我的问题是最后两个之间有什么区别?我以同样的方式访问object方法,唯一的区别是调用它的方式
为什么它会返回一个不同的结果
我第一次在javascript中遇到这个问题。我知道它在一个不同的范围内,但我不知道它是如何与我想理解的对象解耦的
谢谢
当您直接调用对象上的函数时,Stevejavascript会绑定
this
关键字
使用test.fn()
,这将是test
内部fn
。与测试['fn']()相同。
。但是如果您执行var fn=test.fn;fn()
,此
将是fn
内的全局根(浏览器中的窗口
)
您可以在如下函数中强制执行this
:var fn=test.fn.bind(test)代码>
更多信息请参见:案例1:
“this”始终获取其所调用对象的上下文
在p.printName()中,上下文是p,因此“this”引用了“p”引用的Person对象
案例2:
但是,当您将“funcRef”指向p的方法时,它将丢失此上下文,“this”将引用全局对象
根据您的js环境(如浏览器上下文或节点等),全局对象可能会有所不同
这就是为什么你会看到不同的结果 正如另一个答案所说,这个
在调用函数时是绑定的。保持对对象的引用的常用方法是使用以下内容:
var Person = function (name) {
var self = this; // Keep a reference to this object for later use
self.name = name;
self.printName = function(){
console.log("My name is " + self.name);
}
};
上面的答案已经解释了这个作用域的行为,这里是“this”用法的最佳实践,使用“this”作为一个名为“self”的新变量,请参见下面的代码,这样您可以更好地控制这个作用域,减少由于错误使用这个作用域而导致的错误
var Person = function (name) {
var self=this;
self.name = name;
self.printName = function(){
console.log("My name is " + self.name);
}
};
这个
在JS中是后期绑定的。