仍然对JavaScript中的“this”关键字感到困惑

时间:2014-03-15 18:49:10

标签: javascript this scope

var zee5 = "Variable Outside";

function magical( ) {
    this.zee5 = "Variable Inside";
    alert( this.zee5 ); 
}

magical();

alert(zee5); 

在第二个"警报"我期待看到"变量外部"但事实并非如此。我仍然有"变量内部"这意味着

this.zee5 = "Variable Inside";

访问并修改了在脚本顶部创建的zee5变量。我以为this.zee5会将zee5绑定到名为magical的函数。

2 个答案:

答案 0 :(得分:1)

How does the "this" keyword work?中讨论

This致死。特别是,请参阅the top of this answer上的f1示例。

总结相关答案的直接相关部分:

function f() { return this; }
f() === window // -> true

现在,关于"变量范围"的问题是这些答案的补充,但可以概括为:variables in the global context are properties of the global object

var x = "hello";
window.x = "world";
x // -> "world"

所以上下文中的this.zee5 = ..window.zee5 = ..相同,并且在它上面覆盖全局变量/ property ..

要写入名为magical的函数对象的属性,只需使用

var zee5 = "hi"
function magical()
{
   magical.zee5 = "hello"
}
magical()
zee5          // -> "hi"
magical.zee5  // -> "hello"

当然可以得到"偷偷摸摸的"以便this在函数调用中绑定到魔法,例如magical.apply(magical)magical = magical.bind(magical),但我离题了..

答案 1 :(得分:1)

在上面的例子中,“this”关键字仍然引用外部上下文,因此如果您在根范围执行上述代码,this引用窗口。所以你实际上只是在窗口上设置一个名为“zee5”的属性。

您可以在代码中的任何位置使用console.log(this)来查看它指向的内容。

如果要将属性绑定到函数,可以执行类似下面的操作,并将函数分配给变量,而不是使用函数声明。

E.g。如果您将代码更改为以下代码,它可能会按您的想法运行:

var zee5 = "Variable Outside";

var magical = function(){
alert( this.zee5 ); 
}
// sets property zee5 on the variable magical
magical.zee5 = "Variable Inside";
// will alert the property set on magical
alert(magical.zee5)
// when the below executes, "this" still refers to window
magical();
// implicitly calling window.zee5, if done from root context
alert( zee5 );

但我认为你可能会做的是混淆js中新对象的声明方式。例如,如果您执行了以下操作,更改方法以将函数声明用作构造函数,则上下文将更改为您刚刚声明的对象,并且您还将得到您期望的内容:

var zee5 = "Variable Outside";

function magical( )
{
this.zee5 = "Variable Inside";
alert( this.zee5 ); 
}
// will create an object of type magical
// this refers to the new object inside the constructor function
var mag = new magical(); 

alert( zee5 );