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

这个问题最近一直困扰着我,我感到自己无法理解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方法来调用它,或者还是其他方式?所以我的实际问题可能比较底层一点。
一只萌萌小番薯
浏览 556回答 2
2回答

繁花不似锦

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript