认识 JavaScript 可执行代码

引言

当 JavaScript 执行的时候,每遇到一个可执行代码就会创建一个执行上下文。了解 JavaScript 可执行代码的种类,对于我们理解执行上下文的概念至关重要。

JavaScript 可执行代码分为 3 类:全局代码、函数代码、Eval 代码。其中,Eval 代码我们并不常用。

认识 JavaScript 可执行代码_第1张图片

全局代码

全局代码是指写在一个 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 代码。

文章中图片来源于网络,若有侵权行为,请在后台与我联系。

原文链接

原文地址:https://mp.weixin.qq.com/s/c7wJ8tVtI-hRbpdMIMCsEg 

你可能感兴趣的:(认识 JavaScript 可执行代码)