Still confused about “this” keyword in JavaScript
本问题已经有最佳答案,请猛点这里访问。
1 2 3 4 5 6 7 8 9 10 | var zee5 ="Variable Outside"; function magical( ) { this.zee5 ="Variable Inside"; alert( this.zee5 ); } magical(); alert(zee5); |
在第二个"警报"中,我期待看到"外部变量"但事实并非如此。 我仍然有"变量内部"这意味着
1 | this.zee5 ="Variable Inside"; |
访问并修改了在脚本顶部创建的zee5变量。 我以为this.zee5会将zee5绑定到名为magical的函数。
在上面的例子中,"this"关键字仍然引用外部上下文,因此如果您在根范围执行上述代码,则
您可以在代码中的任何位置使用console.log(this)来查看它指向的内容。
如果要将属性绑定到函数,可以执行类似下面的操作,并将函数分配给变量,而不是使用函数声明。
例如。如果您将代码更改为以下代码,它可能会按您的意思工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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中新对象的声明方式。例如,如果您执行以下操作,更改方法以将函数声明用作构造函数,那么上下文将更改为您刚刚声明的对象,并且您还将得到您期望的内容:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 ); |
总结相关答案的直接相关部分:
1 2 | function f() { return this; } f() === window // -> true |
现在,关于"变量范围"的问题是对这些答案的补充,但它可以概括为:全局上下文中的变量是全局对象的属性。
1 2 3 | var x ="hello"; window.x ="world"; x // ->"world" |
所以上下文中的
要写入名为
1 2 3 4 5 6 7 8 | var zee5 ="hi" function magical() { magical.zee5 ="hello" } magical() zee5 // ->"hi" magical.zee5 // ->"hello" |
人们当然可以"偷偷摸摸",以便