调用javascript的奇怪行为

时间:2014-12-16 13:31:23

标签: javascript

我正在学习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

这是代码http://jsfiddle.net/rho3zyb4/

4 个答案:

答案 0 :(得分:0)

您在jsfiddle中运行此代码,不是您:http://jsfiddle.net/4g8q9yor/ - jsfiddle已将您的javascript输出的iframe name分配为result - 所以您实际上是在获取DOM iframe名称。

enter image description here

在本地计算机上创建文件,您将看到正确的输出或在其他地方尝试: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的情况下,窗口的名称就是结果。

如果在具有不同名称的另一个窗口中运行该输出,则输出将不同。