大部分的语法记录在笔记本上,现在写烦了,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;//这俩句是一样的