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对象