引言
当 JavaScript 执行的时候,每遇到一个可执行代码就会创建一个执行上下文。了解 JavaScript 可执行代码的种类,对于我们理解执行上下文的概念至关重要。
JavaScript 可执行代码分为 3 类:全局代码、函数代码、Eval 代码。其中,Eval 代码我们并不常用。
![117e463f763bc61d02abeb291af7503d.png](https://i-blog.csdnimg.cn/blog_migrate/389299b83aa4556f9a5156e8ee9773e2.jpeg)
全局代码
全局代码是指写在一个 JavaScript 文件中或者嵌入 HTML 中的可被 ECMA 脚本程序处理的源代码文本,这些源代码文本不包括函数体部分的源代码文本。例如,下面的示例是一段全局代码的源代码文本:
let str = 'hello world';function foo() { // 函数体中的代码 // 不算全局代码}console.log(str); // hello world
函数代码
函数代码是指作为函数体被解析的源代码文本。例如,foo 函数体的源代码文本:
function foo() { console.log('I like JavaScript'); // 函数代码 console.log('hello world'); // 函数代码}/* *函数代码 *console.log('I like JavaScript'); *console.log('hello world');*/
一个函数代码不包括其嵌套函数的函数代码,例如,foo 函数的函数代码,不包括内部 bar 函数的函数代码:
function foo() { function bar() { console.log('hello world'); // bar 函数的函数代码 } console.log('I like JavaScript'); // foo 函数的函数代码}
如果用 new Function 的方式建立一个函数,调用 Function 构造器时,传入的最后一个参数将被转换成字符串作为函数体。
同样,构造器函数内部嵌套函数的函数代码也不属于构造器的函数代码,例如,sum 函数代码不包括 foo 函数代码:
let sum = new Function( 'a', 'b', // sum 函数的函数代码 // 但不包括其中 foo 函数的函数代码 'function foo() { return a + b; } console.log(a * b , foo());'); sum(1, 2);
Eval 代码
Eval 代码是指传递给 eval 函数的参数部分的源代码文本,此时参数部分将成为可执行的代码。
调用 eval 时,代码中 eval() 这个调用指令本身属于全局代码的一部分,参数才是 eval 代码:
eval('console.log("hello world");'); // eval 的字符串参数为 eval 代码
总结
JavaScript 可执行代码分为 3 类:全局代码、函数代码、Eval 代码。
- 全局代码不包括函数体。
- 函数代码不包括其嵌套函数的函数代码,当用 new Function 构造器创建函数时,最后一个字符串参数为函数代码。
- eval 函数的参数是 Eval 代码。
文章中图片来源于网络,若有侵权行为,请在后台与我联系。