企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
2017.1.15开始读-2017.1.22完成 深入理解js知识点 书籍下载:http://download.csdn.net/detail/u010080803/9738410 第三章 3.4.3 let作用 `var foo = true; if (foo) { let bar = foo * 2; bar = something( bar ); console.log( bar );//2 } console.log( bar ); // ReferenceError ` ~~~ var foo = true; if (foo) { var bar = foo * 2; bar = something( bar ); console.log( bar );//2 } console.log( bar ); // 2 ~~~ 使用 let 进行的声明不会在块作用域中进行提升。声明的代码被运行之前,声明并不 “存在”。 ~~~ console.log( bar ); // ReferenceError! let bar = 2; ~~~ ~~~ console.log( bar ); //2 var bar = 2; ~~~ 第五章:闭包 ~~~ 闭包: function foo() { var a = 2; function bar() { console.log( a ); } return bar; } var baz = foo(); baz(); // 2 —— 朋友,这就是闭包的效果。 ~~~ 函数 bar() 的词法作用域能够访问 foo() 的内部作用域。然后我们将 bar() 函数本身当作 一个值类型进行传递。在这个例子中,我们将 bar 所引用的函数对象本身当作返回值。 在 foo() 执行后,其返回值(也就是内部的 bar() 函数)赋值给变量 baz 并调用 baz(),实 际上只是通过不同的标识符引用调用了内部的函数 bar()。 bar() 显然可以被正常执行。但是在这个例子中,它在自己定义的词法作用域以外的地方 执行。 在 foo() 执行后,通常会期待 foo() 的整个内部作用域都被销毁,因为我们知道引擎有垃 圾回收器用来释放不再使用的内存空间。由于看上去 foo() 的内容不会再被使用,所以很 自然地会考虑对其进行回收。 而闭包的“神奇”之处正是可以阻止这件事情的发生。事实上内部作用域依然存在,因此 没有被回收。谁在使用这个内部作用域?原来是 bar() 本身在使用。 拜 bar() 所声明的位置所赐,它拥有涵盖 foo() 内部作用域的闭包,使得该作用域能够一 直存活,以供 bar() 在之后任何时间进行引用。 bar() 依然持有对该作用域的引用,而这个引用就叫作闭包。 ~~~ function foo() { var a = 2; function baz() { console.log( a ); // 2 } bar( baz ); } function bar(fn) { fn(); // 妈妈快看呀,这就是闭包! } ~~~ 把内部函数 baz 传递给 bar,当调用这个内部函数时(现在叫作 fn),它涵盖的 foo() 内部 作用域的闭包就可以观察到了,因为它能够访问 a。 第二部分:this this 既不指向函数自身也不指向函数的词法作用域.this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。