1、深刻理解JS scope概念=>当前上下文环境:堆栈
active object
global object
JS加载文件后,从上到下顺序编译文件,并将变量声明、函数声明依次压入global object 堆栈,当调用函数或类方法,创建Acitve object,并将函数或类方法中定义的变量、函数压入Active object中,以此类推。当函数引用一个变量会首先查找Active Object 如果未查到依次向堆栈的上一级查询直到Global Object。闭包函数引用定义函数的私有变量,便是创建闭包函数的函数在执行后,因闭包函数的引用而无法销毁内存。
2、逻辑运算符 &&与||的功能
&&或||返回的是左右表达式的值而不是true(1) or false(0)
var c = 1+2 && 1-1=> 若果&&左侧表达式计算结果为真,则直接返回&&右侧表达式的计算结果
=》网站开发常用该表达式进行 左侧表达式变量的赋值,右侧表达式计算
var x;
x=4 && y=x+6;
var c = 1+2 ||1-1=> 若果||左侧表达式计算结果为假,则直接返回||右侧表达式的计算结果
var c = 1+2 && 1-1 => 若果&&左侧表达式计算结果为真,则直接返回&&右侧表达式的计算结果
3、apply \call 方法调用改变this指向,传参方式不同
function test(){}
var myObj = {};
myObj.method = function(){};
test.call(null,2,3,4); =>定义test为全局函数,此处省略了this,补全为this.test.call(null,2,3,4),将test方法绑定到null对象上,传参2,3,4给test函数
myObj.method.apply('',[2,3,4]); =>将对象method方法绑定到""上,传数组给方法。
4、立即执行函数 (函数定义)(实参);或者((函数定义)(实参));
立即执行函数的作用是在函数定义的时候立刻执行,而不是等到外部函数被调用的时候才执行,立即执行函数可映射的变量的实际值而非变量本身。
function test()
{
var arr = [];
for(var i=0;i<10;i++)
{
arr[i] = function(){
console.log(i);
};
}
return arr;
}
var c = test();
for(var j=0;j<10;j++)
{
c[j]();
}
//输出10个10
函数闭包函数映射的i为外部函数test的私有变量,在执行c[]()时,会从作用域链中取变量i的值,i在执行完for循环后,值为10;
为达到输出0-9需要在闭包函数声明的时候,立即计算出i值
function test()
{
var arr = [];
for(var i=0;i<10;i++)
{
((arr[i] = function(j){
console.log(j);
})(i));
}
return arr;
}
var c = test();
for(var j=0;j<10;j++)
{
c[j]();
}
5、构造函数的原型继承(公有原型)=>中间层构造函数,即映射一个构造函数B的原型为A构造函数的原型则A的构造函数原型属性、方法的改变不影响B的原型。
圣杯模式
function inherit(Target,Origin)
{
function F(){};
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructer = Target;
Target.prototype.uber = Origin.prototype;
}
var inherit = (function(){
var F = function(){};
return function(Target,Origin)
{
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructer = Target;
Target.prototype = Origin.prototype;
}
}());