(function(){
function A(){
var v = "a";
this.getVar = function(){
console.log(v);
}
}
function B(){
var v = "b";
A.call(this);
}
var b = new B();
b.getVar(); //a
})();
求这段代码如何理解,为什么var v = "a";注释掉之后会报错,如果用作用域来理解不应该输出b吗?
这个是语法域决定的,而不是在运行的时候决定
A中查找v,只会查找A自己函数内定义的v
找不到,就去上一级找,即这个IIFE里面找,也没找到
再上,global里面也没找到,就报错了
this.getVar = function(){
console.log(v);
}
其中的 v
会一直向上查找,直到 window
。这里会查找 function A()
,然后查找外面的自执行函数,之后再往上找到 window
,都没有v
。
为何不是b
,因为 v = b
在 function B()
中,在function A()
里找不到啊。
call
不会更改作用域,只会改变 this
。
那么修改一下
(function () {
function A(){
//var v = "a";
var self = this;
this.getVar = function(){
console.log(self.v);
}
}
function B(){
this.v = "b";
A.call(this);
}
var b = new B();
b.getVar(); //b
})();