javascript - js里面都是对象。function(){}也应该是一个对象吧。那么问题来了,是传值还是传引用?
阿神
阿神 2017-04-11 11:51:18
[JavaScript讨论组]

那这个function Names() {}和Names=*中的Names是同一个变量吗?

画蓝线的两个Names,是否是同一个对象,是否形成了闭包


Names = (function () { 
    function Names() {console.log(Names.HOME)}       
    Names.HOME = "home";
    return Names;
})();

Names2 = (function () { 
    function Names() {console.log(_HOME)}       
    var _HOME = "home";
    return Names;
})();

有可能是我问的方法不对。Names2肯定是(function () {})();这里就没有释放,形成了闭包。
Names这个是否也形成了闭包,没有释放(function () {})();?
阿神
阿神

闭关修行中......

全部回复(6)
PHP中文网

抱歉, 之前说错了

不是形成闭包, 这是个典型的匿名函数赋值, 匿名函数中的Names和外边的Names互不影响, 流程可理解为

function foo(){
    var Names = function(){ return "hello"; }
    // 写法等同:
    // function Names(){ return "hello"; }
    // 局部变量, 不影响全局
    
    Names.HOME = "home";
    return Names;
}

var Names = foo();

Names.HOME; // "home"
// Names 是个函数对象, 它可以有属性,如HOME, 也可以有方法,如 call(), apply()等
// 当这个对象使用双括号语法时 Names(), 即是执行了这个函数, 如果你了解python, 这个便类似于类的 __call__ 回调
// 函数都有一个callable特性, 函数对象 (参数) 便是触发这个特性, 进入__call__方法处理

Names(); // "hello"

({}).toString.call(Names); // "[object Function]"

语法上js没有传值还是引用的说法, 变量赋值变量的时候, 如果 typeof v == "object" 便是传引用, 元数据(字符串, 数字等)则是传值

a = [1,2,3,4];
b = a;    // b引用a
b[0] = 5; // b数据变了, a跟着变(a,b指向同一个内存地址)
a; // [5,2,3,4] 
怪我咯

没看到哪里有var Names=*

迷茫

我先把我自己想法写出来。是同一个对象,没有形成闭包。

天蓬老师

我把你的方法改成了这样、用同名容易混淆

var Names = (function(){
    function Name(){}

    Names = "home";
    return Name
})()

我的代码是、声明一个function叫Name

把外部的Names赋值home字符串

把Name方法赋值给Names

Names = (function(){
    function Name(){}

    Name.HOME = "home";
    return Name
})()

你的代码也可以改成这样

外部的Names被赋值了几次、你的代码相当于内部声明一个、涉及闭包、Name.HOME也是赋值给内部Name这个function,然后return给外部Names

伊谢尔伦

对底层不是太清楚,在我的观点看来,这两个是一样的,就好比一个人,在公司叫小王,在朋友面前叫老王小王老王只是名字不同,但是是同一个人。对于更底层的编译器来说,只有地址是唯一的,名字只是给人看的。所以名字可以有外号,变量可以有引用。我只要知道它们代表的是同一种东西就好了,没必要纠结为什么名字会不一样。

对于传值还是传引用,就好比了解一个人,你知道他的名字但没见过他的人,这叫传引用,如果当面见到他,这叫传值,因为你见到了他的本尊。

大家讲道理

内外 Names 不是一个变量。
内部 Names 没有释放。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号