为了账号安全,请及时绑定邮箱和手机立即绑定

在javascript中,Function对象的本质是什么?

在javascript中,Function对象的本质是什么?

一只萌萌小番薯 2019-04-08 11:19:29
这个问题最近一直困扰着我,我感到自己无法理解Function对象的本质是什么。如果说是一个普通的js变量。比如vara=5;我可以把它理解为开辟了某个内存给变量a,并把内容赋值为5。那么如果我定义了一个函数:varfn=function(){console.log(this);};它在内存中又是怎么存储的?其实把我的问题再具体话一点,可以这样问:1.Function对象中如何保存作用域链的上下文(context)2.Function对象的函数体是以字符串的形式存储下来的吗?再看看下面这个例子:varfn;(function(){vara=5;fn=function(){console.log(a++);};})();fn();这是个常见的闭包例子,就拿这个例子来说,Function对象是如何把变量a保存在自己的上下文环境中的呢?首先感谢大家热情的回答,我再补充说明一下:我主要的问题是Function在解释器引擎(比如GoogleV8)里是以怎样的形式实现的?是把函数体以字符串的形式存储下来,并在执行时以类似eval方法来调用它,或者还是其他方式?所以我的实际问题可能比较底层一点。
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

Javascript中变量可以存放两种类型的值,一种为原始值(primitivevalue),如Undefined,Null,Boolean,Number,String。这类值存放在栈内部,每赋值一次就创建一个新的拷贝。另一种为引用值(referencevalue),这类值存在堆内存中,只能通过引用赋值。
举例说明:
vara='test';//原始值
varb=function(){};//引用值
我们来测试下:
vara='test';//原始值
varb=function(){};//引用值
b.a='test';
functionchange(m,n){
m='change';
n.a='change';
}
change(a,b);
现在变量a仍然是test,但是变量b的属性a的值则已经为change,这也就是说前者相当于是拷贝了一份值,而后者则是引用赋值。
而闭包问题我是这样理解的,因为Javascript只有两种作用域,一是全局作用域,二是函数作用域,它是没有块级作用域的。所以闭包的出现就相当于利用一个匿名函数的壳模拟出一个块级作用域。举个更明显的闭包例子:
for(vari=0;i<10;i++){
(function(e){
setTimeout(function(){
console.log(e);
},1000);
})(i);
}
联系上面的知识,这里往匿名函数内部传的参数将会被拷贝一份,也就是说循环没执行一次就拷贝变量i的值到匿名函数内部。
这里如果没有闭包的话:
for(vari=0;i<10;i++){
setTimeout(function(){
console.log(i);
},1000);
}
由于变量i直接暴露在全局作用域内,当调用console.log函数开始输出时,这是循环已经结束,所以会输出10个10。
这是我对题主问题的理解,希望能对题主有帮助,可能还有不完善的地方,我打算写篇博文好好总结下。:)
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 555 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信