javascript - js里面都是对象。function(){}也应该是一个对象吧。那么问题来了,是传值还是传引用?

查看:62
本文介绍了javascript - js里面都是对象。function(){}也应该是一个对象吧。那么问题来了,是传值还是传引用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

那这个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 () {})();?

解决方案

抱歉, 之前说错了

不是形成闭包, 这是个典型的匿名函数赋值, 匿名函数中的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] 

这篇关于javascript - js里面都是对象。function(){}也应该是一个对象吧。那么问题来了,是传值还是传引用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆