为什么找不到变量a

obj.foo不能访问xl内部的局部变量a, 但是把var ok = obj.foo,我的理解是把obj.foo的函数体定义给了ok,按理来说,这个时候OK函数,和我二张的图片里,直接定义OK函数,理论上是一样的把,为啥结果不同

这种方式不能访问a
clipboard.png

而下面的又可行

clipboard.png

阅读 5.4k
8 个回答

x1方法中定义的a是局部变量,在x1函数内部可以访问,外部是访问不到的,在调用ok()方法,该方法中没有定义a变量,然后到全局环境中查找,很显然也找不到。

你可以把var a = '11',修改为a = '11',去掉var。a就变为全局变量,foo方法中就可以访问到了。

下面的为什么可行?

执行ok()方法的时候,首先找自己执行环境中的a,没有找到,因为你的ok函数式定义在x1()中的,所以会再去x1()函数的执行环境中查找,在x1()的执行环境中,找到了a。

a是局部变量,x1函数以外访问不到。与函数调用位置没有关系,只与函数声明位置有关系。

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

你可以看一下js的作用域,这里你的变量a的作用域只是在xl()这个方法里面

方法一:

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指向就行啦

你做的这两种都可行么?

貌似都取不到a的值吧,因为这里的调用ok的时候this指向window。

可以去看一下this作用域的知识

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题