首页 > 其他 > 详细

权威指南学习心得-函数

时间:2015-12-17 20:55:22      阅读:280      评论:0      收藏:0      [点我收藏+]

函数

形参在函数中像局部变量一样工作。

函数使用它们实参的值来计算返回值,成为该函数调用表达式的值。除了实参之外。每次调用还会拥有另一值-本次调用的上下文-这就是this关键字的值

如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方方法。当通过这个对象来调用函数时,该对象就是此次调用的上下文,也是改函数的this的值。用于初始化一个新创建的对象的函数称为构造函数

如果一个函数定义表达式包含名称,函数的局部作用域将会包含一个绑定到函数对象的名称,实际上函数的名称将成为函数内部的一个局部变量

function f(){
  console.log(f);
}
f();//

function f(){
window.runnerWindow.proxyConsole.log(f);
}

var t=function test(){
  console.log(t);//

function test(){
window.runnerWindow.proxyConsole.log(t);
window.runnerWindow.proxyConsole.log(test);
}


  console.log(test);//

function test(){
window.runnerWindow.proxyConsole.log(t);
window.runnerWindow.proxyConsole.log(test);
}


};
t();

函数声明语句被提前到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被在它定义之前出现的代码所调用,以表达式定义的函数就另当别论了,为了调用一个函数,必须要能引用它,而要使用一个以表达式定义的函数之前,必须把它赋值给一个变量。变量的声明提前了,但是被变量赋值是不会提前的,所以,以表达式方式定义的函数在定义之前是无法调用的

有4种方法来调用javascript函数

作为函数

作为方法

作为构造函数

通过它们的call和apply方法间接调用

关键值this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,其this的值指向调用它的对象。如果嵌套函数作为函数调用。其this是全局对象

var o={m:function(){
  var self=this;
  console.log(this===o);//true
  f();
  function f(){
    console.log(this===o);//false
    console.log(self===o);//true
    
  }
  
}};
o.m();

如果函数或者方法调用之前带有关键字new,它就构成构造函数调用

构造函数调用创建一个新的空对象,这个对象继承自构造函数的prototype属性,构造函数试图初始化这个新创建的对象,并将这个对象用做其调用上下文,因此构造函数可以使用this关键字来引用这个新创建的对象。注意,尽管构造函数看起来像一个方法调用,但它依然会使用这个新对象作为调用上下文。也就是说,在表达式new o.m()中,调用上下文并不是o。

构造函数通常不使用return关键字,它们通常初始化新对象,当构造函数的函数体执行完毕时,它会显示返回。在这种情况下,构造函数调用表达式的计算结果就是这个新对象的值。然而如果构造函数显式的使用return语句返回一个对象,那么调用表达式的值就是这个对象。如果构造函数使用return语句但没有指定返回值或者返回一个原始值,那么这时将忽略返回值,同时使用这个新对象作为调用结果。

可选形参

function getPropertyNames(o,a){
  a=a||[];
  for(var property in o){
    a.push(property);
  }
  return a;
}

var o={x:1,y:2};

var test=getPropertyNames(o);
console.log(test);//["x", "y"]
function max(){
  var  result=Number.NEGATIVE_INFINITY;
  for(var i=0;i<arguments.length;i++){
    if(arguments[i]>result){
      result=arguments[i];
    }
  }
  return result;
  
}

console.log(max(4,1,8));//8

当一个函数包含若干形参。实参对象的数组元素是函数形参所对应实参的别名,实参对象中以数字索引,并且形参名称可以认为是相同变量的不同命名。通过实参名字来修改实参值的话,通过arguments[]数组也可以获取到更改后的值

arguments.callee和arguments.caller 属性指代当且正在执行的函数

函数作用域的概念:在函数中声明的变量在整个函数体内都是可见的(包括在嵌套的函数中),在函数的外部是不可见的。不在任何函数内声明的变量是全局变量,在整个javascript程序中都是可见的

函数的执行依赖于变量作用域,这个作用域是函数定义是决定的,而不是函数调用是决定的

闭包

每次调用javascrip函数的时候,都会为之创建一个新的对象用来保存局部变量,把这个对象添加至作用域链中。当函数返回的时候,就从作用域链中将这个绑定变量的对象删除。如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,它就会被当作垃圾回收掉。如果定义了嵌套的函数,每个嵌套的函数都各自对应一个作用域链,并且这个作用域链指向一个变量绑定对象。但如果这些嵌套的函数对象在外部函数中保存下来,那么它们也会和所指向的变量绑定对象一样当做垃圾回收。但是如果这个函数定义了嵌套的函数,并将它作为返回值返回或者存储在某处的属性里,这时就会有一个外部引用指向这个嵌套的函数。它就不会被当作垃圾回收,并且它所指向的变量绑定对象也不会被当作垃圾回收。

作用:保存私有变量

var uniqueInteger=(function(){
  var counter=0;
  return function(){
    return counter++;
  };
  
}());

console.log(uniqueInteger());//0
console.log(uniqueInteger());//1
function constfuncs(){
  var funcs=[];
  for(var i=0;i<10;i++){
    
    funcs[i]=function(){
      return i;
    };
    
  }
  return funcs;
  
}
var funcs=constfuncs();
console.log(funcs[5]());//10

 函数的属性:

length 形参的数量

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

权威指南学习心得-函数

原文:http://www.cnblogs.com/yhf286/p/5055185.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!