JS语法(167)

大部分的语法记录在笔记本上,现在写烦了,blog上面写点吧。

function的this指针

void function() { var a = 3; this.a = 5; console.log(a, this.a);}();
//以上是执行一个匿名函数。
//js来说,确实函数也是一个对象。但是像这种调用匿名函数,好像开辟的空间是开辟在全局上面的,
//所以this指向的是全局this。另外如果使用严格模式的话,如果this指向全局就会出错,
//    所以上面句子全局模式下一定错误。

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.sayname = function() {console.log(this.name)};
}
var persion = new Person("wq", 22, "programmar");
这个时候,用了一个new,使得开辟了一个新的对象。这时的this就是函数本身了。
第二个this,是因为function函数拥有了对象,this就一定指向那个对象呀。

原型模式和实例模式

对于对象的构造函数,其属性有两种:

function person() {
    this.name = "ta";//实例模式的属性
    person.prototype.name = "ba";//原型模式的属性
}
//上面俩个属性都可以被var per = new person(); per.name访问到
//per.name = "tc";是实例属性 
//区别:当对象添加一个实例属性时,就会屏蔽原型的同名属性。
//判断:per.hasOwnProperty("name");是否存在实例属性
//hasPrototypeProperty(per, "name")原型是否拥有且未被屏蔽

原型的弊端:它如同c++类里面的static变量一样。
定义的属性属于person.prototype,而不是属于var变量对象。

原型必要:constructor属性最好必须设置,这样就能动态识别对象类型了。

函数闭包

先看代码比较:

1function createfun() {
    var result = new Array();
    for (var i = 0; i < 10; i++) {
        return [i] = function() {return i;};
    }
}
//数组结果:全10;

2function createfun() {
    var result = new Array();
    for (var i = 0; i < 10; i++) {
        result[i] = function(num) {return function () {return num;};}(i);
    }
}
//数组结果:按照i来分配
//这样写的好处是调用时,直接result[i]()就行了。即使有个num参数,也会默认进入的。

原因:函数创建时,会产生作用链。内部活动对象第一位,外部活动对象依次递增。

当执行匿名函数时,匿名函数依旧能找到在作用链中找到i,而此时的i在经过循环玩了后是10,所以一直返回10;


值得一提的是,就是外部函数执行完了,但是内部函数只有拥有引用,就不会对对作用链进行销毁,所以匿名函数依旧能访问到i;

this对象

var name = "all";
var ob = {
    name: "simple";
    getname:function() {
        return function() {return this.name;}
    };
};

//匿名函数的默认this通常是全局的,所以这个不能达到预期效果。
//var that = this;
//return function() {return that.name;}这句替换了便好。

属性

var objectRef = new Object();
objectRef.testNumber = 5;
/* - or:- */
objectRef["testNumber"] = 5;//这俩句是一样的