js问题:请教一下把函数作为参数传递的问题。

在方法内定义一个函数,把它作为参数传入另一个全局函数时,它为什么能够执行呢?不存在作用域的问题吗?

<body>
    <input type="button" value="点击" />
<script>
    function t(x){   //定义一个全局函数t
        alert(x);
        x('哈哈');
    }
    window.onload=function(){ 
        var oBtn=document.body.children[0]; //得到button
        oBtn.onclick=function(){ //button点击的时候
            t(function(c){ alert(c); }); 
            //运行结果:先弹出 function(c){ alert(c); }   
            //再弹出哈哈
        };
    };    
</script>
</body>

下面我的理解(不知道想的对不对):

1.在oBtn.onclick的方法中,定义匿名函数function(c){ alert(c); },作为参数传入全局函数t。

2.函数是引用类型的数据,所以全局函数t 的参数x 保存的是 匿名函数function(c){ alert(c); } 在内存中的一个地址。

3.通过地址来调用这个匿名函数function(c){ alert(c); }。

我迷惑的地方:
匿名函数function(c){ alert(c); }是在oBtn.onclick方法中定义的,它是一个局部的数据。
为什么调用t(function(c){ alert(c); })时,全局函数t的参数x可以得到匿名函数function(c){ alert(c); }的引用?
局部数据不是仅仅在函数内可以访问吗?

阅读 9.2k
7 个回答

function本质是一个对象. alert一个对象好像默认应该调用的toString 然后执行函数本事

t是一个全局函数没错,但是t的调用是在oBtn.onclick的回调函数中的啊,回调函数中的变量就可以访问。
如果按你的理解,函数内部就不能调用任何外部函数了

一个函数的作用域中包含内部变量、函数参数和this

你得t是在oBtn.onclick的函数中定义,函数是可以访问到它父作用域中所定义的变量的,所以可以访问到啊

这在js中喊闭包,即是全局变量可以通过某种方式访问函数的私有变量。根据js的垃圾回收机制,变量没有被间接调用的时候,函数局部执行环境结束的时候也就没有了,如果局部变量中有变量被某个函数或者对象使用到了而这函数亦或者对象暴露外层作用域中,那这个变量是不会被销毁的。
手机码字思维跟不上手速。
照上面的例子来看,你仔细看下,每次点击按钮的时候你都传了个匿名函数,传=创建!意思就是每次点击按钮,首先创建个新的匿名函数,创建完以后就开始当做参数往t函数里丢,所以进去到的t函数里面的匿名函数是一个整体。

js很灵活,函数也是一个变量,也就可以被传递!作用域自然属于他若执行的环境,比如你在a中执行,他的作用域就是a。接触nodejs之后,异步调用非常多。

谢谢大家的帮助,我好像知道是怎么回事了。
我混淆了 标示符查询赋值

        alert(x);
        x('哈哈');
       }
        oBtn.onclick=function(){ //button点击的时候
            t(function(c){ alert(c); }); //调用t,这是标示符查询。本作用域没有t,到父作用域去找,找到t。
            //传参:定义匿名函数,把它的引用赋值给全局函数t的参数 x。现在x也可以操作匿名函数了。                                   
        };

接触js不久,说的有不对的地方,还请朋友们直接指出,谢谢!

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