javascript - js里面都是对象。function(){}也应该是一个对象吧。那么问题来了,是传值还是传引用?
本文介绍了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屋!
查看全文