日期:2014-05-16  浏览次数:20359 次

JavaScript 学习笔记九 new和apply,call

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  不会覆盖变量赋值
?