JavaScript学习笔记三

1,在js里面,函数即对象,程序可以任意操作它们。js可以把函数赋值给变量,或把函数作为参数传递给其它函数。

2,es3和非严格的es5对函数调用的规定,调用上下文(this的值)是全局对象。然而在严格模式下,调用上下文是undefined。

//定义并调用一个函数来确定当前脚本运行时是否为严格模式
var strict=(function(){return !this;}());

3,方法是保存在对象属性里的js函数,方法和this是面向对象编程的核心。方法调用的上下文this就是该对象。

var o={
  x:1,
  y:1,                            
  sum:function(){
    this.total=this.x+this.y;
  }      
}; 
o.sum();//这个方法调用计算1+1的结果    
o.total;//结果为2,

嵌套函数不会从调用它的函数中继承this。如果嵌套函数作为方法被调用,其this的值指向调用它的对象,如果嵌套函数作为函数调用,其this不是全局对象就是undefined。

var  o={  
  m:function(){
    console.log(this===o); //true 
    var self=this;//将this的值保存在变量中                 
    f();  
    function f(){
      console.log(this===o);//false  
    }  
  }
};

5,js函数定义并未指定参数的类型,也不检验传入参数的个数。当传入的参数个数比定义的参数少时,剩下参数设为undefined。在定义可选参数时,可以加/* optional /用于标记参数是可选参数, function f(o,/ optional */ p){}。当实参个数大于形参时,可以通过arguments获取,实参对象是一个类数组对象。在es5严格模式下,arguments为保留字。除了数组,参数对象还定义了callee和caller属性。在es5严格模式下,对这两个属性的读写操作都会产生一个类型错误,而在非严格模式下callee指当前正在执行的函数,caller指调用当前正在执行函数的函数。

var f = function(x){  
  if(x<1)return x;                                          
  return x*arguments.callee(x-1);
}

6,当实参个数过多时,可以传入一个对象,通过属性获取实参的值。

7,js中的函数是一种特殊的对象,当需要一个"静态"变量在调用时保持某个值不变,最方便的就是给函数定义属性。

f.count=0;
function f(){
  retuen f.count++;
}

8,所有的js函数都是闭包,它们都是对象,他们都关联到作用域链。

function cuonter(){
  var n=0;
  return{
    count:function(){return n++;},
    reset:function(){n=0;}
  }
}
var c=counter(),d=counter();
c.count();d.count();//它们互不干扰

9,arguments.length表示出入的实参个数,函数本身的length属性表示期望出入的参数个数(定义时的参数个数)。

function check(args){
  var actual=args.length; //实际参数个数
  var expected=arg.callee.length;//期望参数个数
  if(actual!==expected)
    throw Error("实参个数与期望参数不等");
}
function f(x,y,z){
  check(arguments);
  return x+y+z;
}

10,每一个函数都包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称作“原型对象”。每一个函数都包含不同的原型对象。当将函数用做构造函数的时候,新创建的对象会从原型对象上继承属性。

11,call()和apply()方法
我们可以将call()和apply()看做某个对象的方法,通过调用方法的形式间接调用函数,call和apply的第一个实参是要调用函数的对象,后面的参数是要传入函数的值。apply后面的参数放在数组中。

例:
//f是要调用的函数,o是存放调用函数的对象
f.call(o,1,2);
f.apply(o,[1,2]);

12,bind()方法
bind是es5新增的方法,这个方法的主要作用就是将函数绑定至某个对象。当在函数f()上调用bind方法并传入一个对象o作为参数,这个方法将返回一个新的函数。调用新的函数将会把原始函数f()当做o的方法来使用。

function f(y){return this.x+y;}
var o={x:1};
var g=f.bind(o);
g(2); //结果是3

猜你喜欢

转载自blog.csdn.net/yzx15855401351/article/details/103873368