首页 > JS问题:请教一下,定义在函数内部的window.func(func是个函数) 应该如何理解?

JS问题:请教一下,定义在函数内部的window.func(func是个函数) 应该如何理解?

<script>
    function a(){
        var x=1;
        window.b=function(){
            alert(x);
        }
    }
    a();
    b();//弹出1
</script>

window.b=function(){ // 代码 }
这相当于定义了一个全局函数吧,请问为什么全局函数(window.b)可以访问其他函数(函数a)内部的变量(变量x)呢?

先谢过各位了!

看了两个朋友的回答后,我知道自己的疑问具体是什么了:
window.b是定义一个全局函数,那么window.b和函数a应该都是全局环境下的函数了。
就好像function f1() { // 代码} 和 function f2() { // 代码}一样,都是全局环境下的、同一级别的函数,不存在父函数与子函数的嵌套了。
既然window.b和函数a,两者是同一个级别的函数,为什么window.b还可以访问函数a的局部变量呢?


<script> var b; function a(){ var x=1; b=function(){ alert(x); } } a(); b();//弹出1 </script>

定义是在全局,但是b在a的作用域中被赋值,可以使用a的局部变量


因为JavaScript的作用域是lexical scope。什么是lexical scope(词法作用域or静态作用域)?

Lexical scope is based on where variable and blocks of scope authored, by you, at write time.

也就是说,函数的lexical scope是却决于你在哪里定义这个函数的。

那么好,你的b是定义在a里面的。所以作用域链是这样的: global scope <- a's scope -> b's scope

  1. b要引用x的时候,首先在自己的作用域找,找不到。
  2. 那么继续想上找(直到global scope)。于是,在a的作用域就找到了。

就算awindow.b是同一个级别的函数,但是两者被定义的地方不同,前者被你定义在global scope,
后者则定义在a的scope。而lexical scope又是却决于你是在哪里定义函数的。

不如,写成这样,或许可以更好理解。

javascript// foo is defined in global scope
function foo() {
  var x = 1;

  // bar is defined in a's scope
  var bar = function() {
    console.log(x);
  }

  return bar;
}

var baz = foo();
baz();

闭包?

function a(){
        var x=1;

        var b = function () {
            alert(x);
        }

        return b;
    }

b()函数是个匿名函数表达式,并且是该表达式赋值给了b全局变量,这种情况下b()其实就是作为全局环境的变量对象window的方法创建的,在b()中会有个作用域链,它可以向上访问来自包含环境a()的所有的变量或函数,其实这也是闭包的特性之一:函数可以访问另一个函数的值,也就是函数套函数,子函数可访问父级函数的所有值,粗浅理解,有什么不对的地方恳求指正- -


b() 是闭包,通过b()a()外访问a()中的变量是闭包特性之一。

【热门文章】
【热门文章】