var a; // same as : var a=undefined;
变量提升(hoisting):
var a=123;
function f(){
alert(a);//undefined
var a=1;
alert(a);// 1
}
f();
因为函数作用域始终优先于全局作用域,所以局部变量a会覆盖掉所有与它同名的全局变量。
当JavaScript执行过程进入新的函数时,这个函数内被声明的所有变量都会被移动到函数最开始的地方,
但是被提升的只有变量的声明,而与之相关的赋值操作并不会被提升,还在原来的位置。而声明后未被赋值的变量
都被默认赋值为undefined。所以第一次alert()结果为undefined。
var f=function(){
return 1;
}
这种定义方式通常称为函数表示记法(function literal notation)
闭包:
N():升级作用域后保留原来对F()作用域的访问权限
构造器函数:
function Hero (name){
this.name=name;
this.occupation='Nanja';
this.whoAreYou=function(){
return "I'm"+this.name+" and I'm a "+this.occupation;
} ;
}
利用构造器创建对象:
var h1= new Hero('Michelangelo');
h1.whoAreYou();
//若在创建对象时不加 new ,则typeof h1 结果为undefined。由于我们在Hero中使用了this,this指向全局对象。
全局对象:
程序所在的宿主环境一般都会为其提供一个全局对象,而所谓的全局变量其实都只不过是该对象的属性。
当宿主环境为web时,全局对象就是window。
若函数没有返回值,则默认返回this
function C(){
this.a = 1;
//return this;
}
请问this值指向的是全局对象还是对象o?
function F(){
function C(){
console.log(this);
return this;
}
return C();
}
var o=new F();
// this指向全局对象
Object.hasOwnProperty():检测一个属性是自身属性还是原型属性,返回值为boolean类型。
获得对象中所有属性列表:
for-in循环:
var parmas={
productid:777,
section:’products’
};
var query;
for(var i in params){
query.push(i);
}
console.log(query);
通过对象的propertyIsEnumerable()方法来判断一个属性是否可枚举。
原型prototype是构造器所有,作为该构造器创建的对象的原型:
parent.isPrototypeOf(child)=》 true;
构造器constructor属性是对象的构造器
child.constructor==parent =>true
child instanceof parent => true
obj.getPrototypeOf() :获取对象原型
__proto__: 这东西与prototype并不等价 它时某个实例的属性,而prototype是构造器函数的属性。尽量不在实际脚本中使用,因为IE等浏览器不兼容这个属性,无法实现跨平台应用。
利用prototype扩展内建对象
String.prototype.reverse=function(){
return Array.prototype.reverse.apply(
this.split('')).join('');
};
var str='1234';
console.log(str.reverse());
->’4321’
//该技术最常见的应用为让老式浏览器支持已被EMACScript委员会标准化了的,为现代浏览器所实现的新功能。通常把这类扩展叫做shims后polyfills
//若该技术应用不谨慎,则会导致js版本更新后命名冲突等问题,所以要慎重!
当扩展原型时应该检查方法是否存在:
向原型中添加trim()方法:
当重写某些对象的prototype时,需要重置相关的constructor属性:
function Dog(){}
Dog.prototype={};
new Dog().constructor===Dog;//false
Dog.prototype.constructor=Dog;
new Dog().constructor===Dog;//true
sort(sortby):若不传入sortby函数,则默认按照字母顺序(字符编码顺序)排序。
封装后的继承函数:
function extend(Child,Parent){
var F=function(){};
F.prototype=Parent.prototype;
Child.prototype=new F();
Child.prototype.constructor=Child;
Child.uber=Parent.prototype;
}
function Shape(){
this.name='shape';
}
Shape.prototype.size='100';
function Demo(){
this.name='demo';
}
extend(Demo,Shape);
var xxy=new Demo();
精确延时:requestAnimationFrame()