第1页 1
- 章节名:1
- 页码:第1页
2.2.3 性能 引擎在代码中发现了eval(..)或with,它只能简单地假设关于标识符位置的判断都是无效的,因为无法在词法分析阶段明确知道eval(..)会接收到什么代码,这些代码会如何对作用域进行修改,也无法知道传递给with用来创建新词法作用域的对象的内容到底是什么。 3.3 匿名函数在栈追踪中不会显示出有意义的函数名,使得调试很困难。 给函数表达式命名是一个最佳实践:
setTimeout(function timeoutHandler() { // <-- 快看,我有名字了! console.log("I waited 1 second!"); }, 1000);3.4 try/catch的catch分句会创建一个块作用域,其中声明的变量仅在catch内部有效。
try { undefined(); // 执行一个非法操作来强制制造一个异常 } catch (err) { console.log(err); // 能够正常执行! } console.log(err); // ReferenceError: err not found3.4.3 块作用域便于垃圾收集 4 提升 先有蛋(声明)后有鸡(赋值)。
a = 2; var a; console.log( a ); //等同 var a; a = 2; console.log( a ); console.log( a ); var a = 2; //等同 var a; console.log( a ); a = 2;无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。 只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。 4.3 函数优先 函数会首先被提升,然后才是变量。
foo(); // 1 var foo; function foo() { console.log(1); } foo = function() { console.log(2); }; //引擎理解 function foo() { console.log( 1 ); } foo(); // 1 foo = function() { console.log( 2 ); };5 闭包 清晰展示闭包的代码
function foo() { var a = 2; function bar() { console.log(a); } return bar; } var baz = foo(); baz(); // 2 ———— 朋友,这就是闭包的效果。将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。 在定时器、事件监听器、Ajax请求、跨窗口通信、Web Workers或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包! 5.4 循环和闭包
for (var i = 0; i <= 2; i++) { nodes[i].onclick = function(i) { return function() { console.log(i) } }(i) } // 等效 for (let i = 0; i <= 2; i++) { nodes[i].onclick = function() { console.log(i) } }
○对本书的所有笔记 · · · · · ·
-
第1页 1
-
第2页 模块机制
5.5.1 var MyModules = (function Manager() { var modules = {}; function define(name, dep...
-
第3页 第一部分 附录
动态作用域 function foo() { console.log(a); // 2 } function bar() { var a = 3; foo(); }...
说明 · · · · · ·
表示其中内容是对原文的摘抄