js常用
1.获取滚动条到网页头部的高度:
Var top=document.documentElement.scrollTop+document.body.scrollTop;
document.documentElement.scrollTop和document.body.scrollTop的作用相同:都是获取滚动条到网页头部的高度,二者相加是为了更好的兼容
2.获取页面的高度
Var textHeiht=$(document).height();//获取的是整个页面的高度
Var visibleHeight=$(window).height();//获取的是浏览器所能看到的那部分页面高度
3.call 和 apply方法:可以将call和apply看作某个对象的方法,通过调用方法的形式间接调用函数
A)如:function testFun(){
return this.a+this.b
}
var o={a:1,b:2};
testFun.call(o);//可理解为,o调用testFun方法;结果为3
testFun.apply(o);//结果为3
B)call和apply方法的第一个实参为null或undifined的情况
var a=10,b=20;
function testFun(){
return this.a+this.b;
}
testFun.call();//结果为30
testFun.apply();//结果为30
C)call和apply方法的区别
function testFun(x,y){
return this.a+this.b+x+y;
}
var o={a:1,b:2};
testFun.call(o,10,20);//call方法传入多个参数,逗号隔开即可;结果为33
testFun.apply(o,[10,20]);//apply方法将第一个实参后的所有参数都放入一个数组中,结果为33
4.eval(“(”+data+”)”)使用eval对json进行解析的时候,json字符串通产被包含在一个小括号里:eval(“(”+data+”)”)
这回括号会让解析器强制将小括号解析成表达式而不是代码块
5.函数的声明和函数表达式的区别:
A.函数的声明会在任何表达式被解析和求值之前被解析和求值,即使声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值
B.声明函数在条件语句内虽可以使用,但没有标准化,即不同的环境会有不同的执行结果,所以这种情况最好使用函数表达式
C.函数的声明:
a.function add(x,y){
return x+y;
}
b.(function (){
function add() {}
})()
D.函数的表达式:
a.var bar=function boo(){}
b.new function boo(){}
E.函数命名表达式即函数表达式有自己的名字:如var bar=function boo(){}
6.声明变量:
Var cnblogs=cnblogs || {}
确保cnblogs存在的时候直接使用,不存在的时候直接赋值为{}
7.prototype原型使用方法
A.var Calculator=function(decimalDigs,tax){
this.decimalDigs=decimalDigs;
This.tax=tax;
}
通过给Calculator的prototype属性赋值字面变量来设定Calculator对象的原型
Calculator.prototype={
add:function(x,y){
return x+y;
},
subtract:function(x,y){
return x-y;
}
}
通过new Caluclator对象后,就可以调用add方法
B.在赋值原型的时候使用function立即执行的表达式来赋值
Calculator.prototype=function(){
add=function(x,y){
return x+y;
},
subtract=function(x,y){
return x-y;
}
}
通过new Calculator对象后就可以调用add方法了
C.分步设置每个原型的属性
var BaseCalculator=function(){
this.number=2;//为每一个实例都声明一个小数位数
}
//使用原型给BaseCalculator扩展两个属性
BaseCalculator.prototype.add=function(x,y){
return x+y;
}
BaseCalculator.prototype.subtract=function(x,y){
return x-y;
}
D.将BaseCalculator对象设置到真正的Calculator原型上
var BaseCalculator=function(){
this.decimalDigits = 2;
}
BaseCalculator.prototype={
add:function(x,y){
return x+y;
},
subtract:function(x,y){
retrun x-y;
}
};
var Calculator=function(){
This.tax=5;//为每个实例都声明一个税收数字
}
Calculator.prototype=new BaseCalculator();//即Calculator的原型指向BaseCalculator的原型实例上,目的是让Calculator集成它的add和subtract方 法,无论创建多少个Calculator实例,它们的原型都指向同一个实例
如果不想让Calculator访问BaseCalculator构造函数声明的属性:
Calculator.prototype=BaseCalculator.prototype;
E.重写原型
calculator.prototype.add=function(x,y){
return x+y+3;
}
var cal=new Calculator();
alert(cal.add(3,1));
F.闭包:闭包是一系列函数(在ECMAScript中是函数),并且静态保存所有父级的作用域。通过这些保存的作用域来搜寻到函数中的自由变量。
示例://全局变量x
var x=10;
//全局函数
function foo(){
console.log(x)
}
(function(funArg){
//局部变量x
var x=20;
//我们使用foo函数的scope保存的是全局变量x,不是调用者的局部变量x
funArg();//返回结果是10,而不是20
})(foo)//将foo作为一个funarg传递下去
该例可以看出使用静态作用域是闭包的一个强制性要求
G.this指针:
a.this是和执行上下文环境息息相关的一个对象,this是执行上下文环境的一个属性而不是 某个变量对象的属性
b.在一个函数上下文中,this由调用者提供,由调用函数的方式决定。如果调用括号()左边是引用类型的值,this将设为引用类型的base对象,在其他情况下(与引用类型不同 的任何其他属性),这个值为null,当this为null的时候,其值会被隐式的转换为global对象