obj.foo不能访问xl内部的局部变量a, 但是把var ok = obj.foo,我的理解是把obj.foo的函数体定义给了ok,按理来说,这个时候OK函数,和我二张的图片里,直接定义OK函数,理论上是一样的把,为啥结果不同
这种方式不能访问a
而下面的又可行
obj.foo不能访问xl内部的局部变量a, 但是把var ok = obj.foo,我的理解是把obj.foo的函数体定义给了ok,按理来说,这个时候OK函数,和我二张的图片里,直接定义OK函数,理论上是一样的把,为啥结果不同
这种方式不能访问a
而下面的又可行
var obj = {foo:function(){console.log(a)}};
function x1() {
var a = '1';
// 把ok 替换为下面的函数 自然找不到
(function(){console.log(a)})()
}
x1()
你是想问,为啥ok()没有log出a(‘11’)是吧?
这是作用域相关的问题。
记住这句话,变量的访问权取决于变量在哪里声明,不是在哪里调用。
首先var a = '11'是声明在x1函数的局部作用域,然后你在x1里调用x1作用域外的函数obj.foo。
因为obj.foo没有声明在x1作用域内,所以obj.foo没有访问x1里的变量a的权限。
你如果在 全局声明一个a,那就可以log出全局的那个a
方法一:
var obj={
foo:function (a) {
console.log(a)
}
}
function x1() {
var a='11232131'
var ok=new obj.foo(a)
}
x1()
方法二:
var obj={
foo:function () {
console.log(this.a)
}
}
function x1() {
this.a='11232131'
obj.foo.call(this)
}
var f=new x1()
改变a的this指向就行啦
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
x1方法中定义的a是局部变量,在x1函数内部可以访问,外部是访问不到的,在调用ok()方法,该方法中没有定义a变量,然后到全局环境中查找,很显然也找不到。
你可以把var a = '11',修改为a = '11',去掉var。a就变为全局变量,foo方法中就可以访问到了。
下面的为什么可行?
执行ok()方法的时候,首先找自己执行环境中的a,没有找到,因为你的ok函数式定义在x1()中的,所以会再去x1()函数的执行环境中查找,在x1()的执行环境中,找到了a。