我目前正在学习Javascript。
我想出了以下代码示例
var gc = "From Global";
var mp = {
gc : "Inside mp",
funct : function(){
console.log( gc); //Calls global instead of local
}
}
var ft = function() {
gc = "Inside Function";
this.funct = function(){
console.log(gc); //Calls locally declared variable
}
}
mp.funct(); //calls gc from global scope --->A
var inst = new ft();
inst.funct(); //calls gc from its local scope --->B
我想知道为什么语句A打印全局变量的值,而语句B打印其本地范围变量的值。我被告知这与语句B创建ft的实例并且其上下文是ft而事实声明A上下文是窗口并且全局本地窗口的局部变量是gc gloable这一事实有关。那是对的吗 ?如果是这样,那么我对于在
的印象下我的背景感到困惑foo.bar() ; //Here foo is the context
m.j; //Here m is the context
窗口如何成为mp.funct()
答案 0 :(得分:1)
在这个例子中:
var mp = {
gc : "Inside mp",
funct : function(){
console.log( gc); //Calls global instead of local
}
}
您必须调用this.gc
,因为对象成员(键值对)不是变量,而是对象的成员。
在这个例子中:
var ft = function() {
gc = "Inside Function";
this.funct = function(){
console.log(gc);
}
}
gc
不是对象成员,并覆盖您设置的全局变量。因此,您只需记录gc
并获得预期值。
您还可以声明一个本地范围的变量:
var ft = function() {
var somethingLocal = "I am local";
this.funct = function(){
console.log(somethingLocal); // Calls locally declared variable
}
}
答案 1 :(得分:0)
来自MDN JavaScript Scope
的引用JavaScript有两个范围:全局和本地。一个变量 声明在函数外定义是一个全局变量,它的 在整个程序中,值是可访问和可修改的。一个变量 在函数定义中声明的是本地的。它被创造了 每次执行函数时都会被销毁,而且不可能 由函数外部的任何代码访问。 JavaScript不支持 块作用域(其中一组大括号{...}定义了一个新的作用域), 除了块范围变量的特殊情况。
在您的代码中,mp
在全局范围内定义,在函数ft
之外。当您调用mp
中定义的函数时,成员funct
将不会“看到”同一对象中的其他成员。它可以看到的是mp
所处的背景。
当您在ft
内执行相同操作时,gc = "Inside...";
正在更改全局变量gc
。因此,当您使用gc
时,它实际上是在全局范围内使用那个。
修改强>
感谢@ t.niese指出一个gc
未在本地定义的错误。刚刚修改过。
答案 2 :(得分:-1)
“mp”是一个Javascript对象,而“ft”是一个函数。差别就是这样。
mp.gc和mp.funct是Javascript对象中的“键”,而不是变量。如果你想让mp使用mp.gc你可以这样做:
var mp = {
gc : "Inside mp", // not a variable by itself, only a variable if used as mp.gc
funct : function(){
console.log( this.gc); //Calls "local" now
}
}