返回信息流之前理解有误,重点在于看作用域链,dcy0701最新的一篇文章http://www.byr.pub/wordpress/2016/04/10/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E4%BD%9C%E7%94%A8%E5%9F%9F%E4%BB%A5%E5%8F%8A%E5%87%BD%E6%95%B0%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/
===========================================分割线==================================================
在@dcy0701的帮助下,已经弄明白了,可以看做是一个IIFE,并传入了当前this作为上下文,相当于下面的代码:
(function(){
function A(){
var v = 'a';
this.getVar = function(){
console.log(v);
}
}
function B(){
var v = 'b';
(function(self){
var v = 'a';
self.getVar = function(){
console.log(v);
}
})(this);
}
var b = new B();
b.getVar();
}());
所以是相当于分成了两层,根据作用域链,首先访问到内部的v,也就是'a',其实并未对B中的v进行重新赋值
=====================================分割线=====================================================
(function(){
function A(){
var v = 'a';
this.getVar = function(){
alert(v);
}
}
function B(){
var v = 'b';
A.call(this);
}
var b = new B();
b.getVar();
})();
这是一条镜像帖。来源:北邮人论坛 / www-technology / #35325同步于 2016/4/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
这道js题应该怎么理解呢
YehBeats
2016/4/8镜像同步34 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
A.call(this); // 在 function B 中执行 A(),同时改变了函数执行的上下文。此处相当于 b 有了 getVar 方法。
至于 getVal() 的结果,感觉从原型链上查询第一个会找到的是 'a'... 而'b' 在 'a' 更上一层。
都是瞎扯。你看看这个输出什么
(function(){
function A(){
this.getVar = function(){
alert(v);
var v=“啊”;
}
}
function B(){
A.call(this);
var v = 'b';
}
var b = new B();
b.getVar();
})();
发自「贵邮」
这道题考的就是作用域,本质上和
var a = 1;
(function () {
console.log(a);
var a = 2;
})();
一样,考查变量提升与作用域链是否清晰。
A.call(this)这句相当于:
function B(){
var v = 'b';
var v = 'a';
this.getVar = function(){
alert(v);
}
}
这时候和A已经没啥关系了,B里v的值被第二次声明覆盖为‘a’。
看来我之前理解错了,上午仔细的研究了一下,加深了对apply和call的理解,A.call(B).就是A中所有的this,用B来取代。这个比起教科书所说的把A放在B的环境下执行不知道精准多少倍。你按照这个思路理解,再结合类的私有变量就能理解这个了。。。