日期:2014-05-16 浏览次数:20343 次
function logs(obj){document.write(obj+"<br/>");} //new 操作 function Shape(type){ this.type = type || "rect"; this.calc = function (){ return "calc,"+this.type; } } //通过 new 操作符来作用与一个函数 //首先,创建一个空对象 //然后用函数的 apply 方法,将这个空对象传入作为 apply 的第一个参数,及上下文参数。 //这样函数内部的 this 将会被这个空的对象所替代 var triangle1 = new Shape("triangle"); logs(triangle1.calc()); // 上面的操作如下 同样效果 var triangle2 = {}; Shape.apply(triangle2,["trangle2"]); logs(triangle2.calc()); //区分apply,call就一句话, //foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3) //call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype, //所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针 //对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同 //相同点:两个方法产生的作用是完全一样的 //不同点:方法传递的参数不同 //当参数明确时可用call, 当参数不明确时可用apply给合arguments //http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html //下面记住两点 //1. 所有的变量声明都在范围作用域的顶部 //2. 所有的全局变量都是window的属性 //如下1: if (!("a" in window)) { var a = 1; } logs(a);//undefined //如下2: logs("a" in window);//true 尽管a是后来申请的, //但JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部 var a; //1.函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明 function functionName(arg1,arg2){} //2.函数表达式没有提前,就相当于平时的变量赋值 var functionName = function(arg1,arg2){} //3.函数声明会覆盖变量声明,但不会覆盖变量赋值 function value (){ return 1;} var value; logs(typeof value);//function 覆盖变量声明 var value = 1; logs(typeof value);//number 不会覆盖变量赋值?