Javascript”;这个“;作用域根据调用方式给出不同的结果
Javascript "this" scope giving different result depending on the way it is called
全部,
这是代码:
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
在此处查找工作示例:http://plnkr.co/edit/57LS6oXPfqccAWf6uqQV?p=preview
我的问题是后两者之间有什么区别?我以相同的方式访问对象方法,唯一的区别是调用它的方式。
为什么会返回差异结果?
我第一次在javascript中看到这个。我知道它在一个不同的范围内,但我不知道它是如何与对象解耦的,这正是我想要理解的。
感谢
Steve
javascript在直接调用对象上的函数时绑定this
关键字。
对于test.fn()
,this
将是fn
中的test
。与test['fn']()
相同。但如果执行var fn = test.fn; fn()
,则this
将是fn
中的全局根(浏览器中的window
)。
您可以在这样的函数中强制使用this
:var fn = test.fn.bind(test);
更多信息请点击此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
案例1:"this"始终采用其所调用对象的上下文。
在p.printName()中,上下文是p,因此"this"引用"p"所指的Person对象。
情况2:但是,当您将"funcRef"指向p的方法时,它将丢失此上下文,"this"将引用全局对象。
全局对象可能会根据您的js环境(如浏览器上下文或节点等)而有所不同。
这就是为什么你会看到不同的结果。
正如其他答案所说,当您调用函数时,this
是绑定的。保持对对象引用的一种常见方法是使用这样的东西:
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);
}
};
- 显示可链接的搜索结果+对齐方式
- 正则表达式,两种方式,不同的结果
- Javascript:我可以't找到正确的方式来表达布尔“;如果“;以得到我想要的结果
- JavaScript/jQuery:格式化日期计算结果的最佳方式
- 注入jquery会完全改变页面结果——这是一种糟糕的方式
- Select2 以编程方式设置搜索词并打开包含相关结果的下拉列表(无 ajax 调用)
- JavaScript 对象,使用两种不同的调用函数方式查看预期结果
- Javascript”;这个“;作用域根据调用方式给出不同的结果
- 承诺在以不同方式执行时显示不同的结果
- 以编程方式运行摩卡时的访问结果
- 搜索数组并返回结果的最佳方式
- 在html页面中以有序的方式显示结果
- 将查询结果传递到另一个页面的最佳方式
- 从Q.all压缩结果的最佳方式
- 需要一种优雅的方式来根据输入改变一行if语句的返回结果
- JavaScript模块模式以两种不同的方式编写,结果相同
- 为什么在+=操作中使用串联的变量会根据它的定义方式产生不同的结果?
- 如何更改在此字符排序器代码中显示结果的方式
- 如何执行PHP代码,并获得结果,就像当一些数据输入通过任何方式javascript等
- 以编程方式触发typeahead.js结果显示