代码信息来自于http://ejohn.org/apps/learn/. 自执行,临时,函数 (function(){ var count = 0; })(); 这是一个简单的自执行匿名函数. 做一个点击计数 document.addEventListener("click", (function(){ var numClicks = 0; return function(){ alert( ++numClicks ); }; })(), false); 关键代码是,自执行匿名函数,返…
主要内容: 分析JavaScript的词法作用域的含义 解析变量的作用域链 变量名提升时什么 一.关于块级作用域         说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. 例如C#中下面代码: static void Main(string[] args) { if(true) { int num = 10; } System.Console.WriteLine(num); } 这段代码如果进行编译,是无法通过的,因为"当前上下文中不存在名称num". 因为…
JavaScript只有函数作用域:每个函数都有个作用域链直达window对象. 变量的查找由内而外层层查找,找到即止. 同时不仅可以查找使用,甚至可以改变外部变量. var color = "blue"; function changeColor() { var anotherColor = "red"; function swapColors() { var tempColor = anotherColor; anotherColor = color; colo…
代码信息来自于http://ejohn.org/apps/learn/. 先给出一个权威的定义,函数对象可以通过作用域相互关联起来,函数体内的变量可以保存在函数的作用域内,这种特性称为闭包. 在闭包内的闭包为未释放前,作用域链上的变量一直存在. 如果你觉得这个定义太抽象,你可以先记住javascript所有的函数都是闭包,了解函数作用域的特点也就了解了闭包,尤其是当函数内还有函数时的情况. 闭包外面不可以引用里面 function closure(){ var inner = 5; } cons…
一.JS中的数组 1.数组的三种定义方式 (1).实例化对象 var aArray=new Array(1,2,3,4,5); (2).快捷创建 var aTwoArray = [1,2,3,"d","f"]; (3).多维数组 var aThreeArray = [[1,2,3],["a","b","c"]]; 在这里,只有满足了数组中的元素是数组的时候才是多维数组 2.数组的操作 (1).给数组增加单个…
代码信息来自于http://ejohn.org/apps/learn/. 函数的长度属性如何工作? function makeNinja(name){} function makeSamurai(name, rank){} console.log( makeNinja.length == 1, "只定义了一个形参" ); console.log( makeSamurai.length == 2, "定义了两个形参" ); 很清楚,函数的长度就是定义形参的个数. 我们…
memoization是一种非常有用的优化技术,它缓存特定输入产生的相应结果.这样麻烦的查找和迭代计算可以尽可能的减少. 它基本的思想是针对特定的输入,已经计算过的结果都是通过缓存当中的数据直接返回而不是经过重复的计算. 实现记忆函数 我们可以简单的将memoization理解为记忆函数经过特定输入产生的结果. 下面是一种基本简单且实用的实现方法,可以很清晰的显示记忆函数的结构 function memoize( fn ) { return function () { // 将参数转为数组 va…
代码信息来自于http://ejohn.org/apps/learn/. 当我们将一个对象的点击事件绑定到一个事件触发元素时会发生什么? <ul id="results"> </ul> <script> var Button = { click: function(){ this.clicked = true; } }; var elem = document.createElement("li"); elem.innerHTML…
代码信息来自于http://ejohn.org/apps/learn/. 可以修改内置对象的方法. if (!Array.prototype.forEach) { Array.prototype.forEach = function(fn){ for ( var i = 0; i < this.length; i++ ) { fn( this[i], i, this ); } }; } ["a", "b", "c"].forEach(fun…
代码信息来自于http://ejohn.org/apps/learn/. 继承是如何工作的 function Person(){} function Ninja(){} Ninja.prototype = new Person(); var ninja = new Ninja(); console.log( ninja instanceof Ninja, "ninja自动接收Ninja.prototype里的属性" ); console.log( ninja instanceof Pe…