我正在学习Javascript,我在我的书上找到了这个例子
function sayNameForAll(label) {
console.log(label + ":" + this.name);
}
var person1 = {
name: "Nicholas"
};
var person2 = {
name: "Greg"
};
var name = "Michael";
sayNameForAll.call(this, "global");
sayNameForAll.call(person1, "person1");
sayNameForAll.call(person2, "person2");
输出:
"global:Michael"
"person1:Nicholas"
"person2:Greg"
我了解call
的工作原理,但sayNameForAll.call(this, "global");
的输出不是global:Michael
,而是global:result
。
答案 0 :(得分:0)
您在jsfiddle中运行此代码,不是您:http://jsfiddle.net/4g8q9yor/ - jsfiddle已将您的javascript输出的iframe name
分配为result
- 所以您实际上是在获取DOM iframe名称。
在本地计算机上创建文件,您将看到正确的输出或在其他地方尝试:http://js.do/code/48143输出:
global:Michael
person1:Nicholas
person2:Greg
答案 1 :(得分:0)
默认情况下,JSFiddle将您的代码封装在一个闭包中。这意味着var name
生成局部变量,而不是全局变量。
this
,如果没有明确的上下文,将默认为window
(至少,如果严格模式关闭,它将会)。变量将默认为全局,它将成为window
的属性(同样,如果严格模式已关闭)
巧合的是,它们会产生相同的结果,并且有效。
但JSFiddle包装通过改变局部变量来搞定它,所以它们不再引用相同的东西 - 事实上这正是严格模式禁用行为的原因 - 它不可靠!
http://jsfiddle.net/rho3zyb4/1/更新了小提琴,以“无包裹”模式显示结果。
答案 2 :(得分:0)
如果你在控制台和jsfiddle中运行它会得到不同的结果,那是因为"这个"在jsfiddle中是一个不同的对象
jsFiddle输出:
global:result
person1:Nicholas
person2:Greg
标准控制台输出
"global:Michael"
"person1:Nicholas"
"person2:Greg"
答案 3 :(得分:0)
通过这个,你通过" window"在jsfiddle的情况下,窗口的名称就是结果。
如果在具有不同名称的另一个窗口中运行该输出,则输出将不同。