现在的位置: 首页 > 综合 > 正文

javascript 学习笔记(3)

2017年11月27日 ⁄ 综合 ⁄ 共 1849字 ⁄ 字号 评论关闭

javascript的函数主要可以用于以下几个方面:

  1. 赋值给一个变量;
  2. 赋值给对象一个属性;
  3. 作为参数传入别的函数;
  4. 作为别的函数的返回值;
  5. 用字面量创建(此处还未明白,是用var a={ a:function(){} }这样的方式进行创建吗)

javascript函数的参数,即使在定义函数没有加任何的形参,也可以将任意多的参数传入函数进行处理。其原理是javascript在处理函数与其他的编程语言不一样,解释器传递给函数的是一个类似于数组的内部值,叫arguments,在函数对象生成时被初始化。

function sum(){  
    var result = 0;  
    for(var i = 0, len = arguments.length; i < len; i++){  
       var current = arguments[i];  
       if(isNaN(current)){  
           throw new Error("not a number exception");  
       }else{  
           result += current;  
       }  
    }  
     
    return result;  
}  

javascript的作用域为函数作用域,无块作用域,

function func(){
  for(var i=0;i<arguments.length;i++){
    print(arguments[i]);
  
  }
  print(i);
 
}

func('a','b','c');

javascript的函数在局部作用域内运行,可以访问其外部作用域内的变量和函数(可能是全局的作用域的变量和函数)。javascript的作用域为词法作用域,就是在函数定义就确定下来而不是在执行才确定。如下函数在执行函数时,第一次打印str,访问在函数作用域内未定义的变量str会打印undefined。

var str="global";
function func(){
  print(str);
  var str="private";
  print(str);
}
func();//打印为undefined和private 

对以上的代码片段进行详细的说明:第一行定义的str,将global赋值给它,在定义时会被放在作用域链的头部即全局作用域中;在调用func的时候,javascript解释器会生成一个call object(调用对象),并将func中通过var定义的变量设为它的属性,然后将call object放到作用域的最前端,即拥有最优先的访问权。在访问str时,会首先查询func的访问对象,查询其中是否有该变量的定义,如果没有找到则会查找call object的上一层作用域,直到查找全局作用域。在上面的代码片段中,在func的call object中查找str,找到str覆盖全局作用域的str,但在调用str时,在该函数体中还未定义赋值 ,所以会打印undefined.

javascript中的函数上下文: 在java/C中方法是依附于对象存在的,而在javascript中函数也是对象,是对立存在的,可以作为一个对象的属性,方法,也可以作为另一个对象的函数方法。因些函数的上下文也是变化的,与此同时函数体内的this也是变化的。函数通过调用call方法和apply方法来改变函数的上下文。

call 方法和apply 方法的使用如以下代码片段所示:

var jack={
 name:'jack',
 age:20
};
var rose={
 name: 'rose',
 age:19
};
function printName(){
  return this.name;
};
print(printName.call(jack));//上下文为jack
print(printName.call(rose));//上下文为rose
print(printName.apply(jack));
print(printName.apply(rose));

在传入一个参数时,call方法和apply方法是相同的。传入多个参数时call方法和apply方法有所不同,差异主要如以下代码片段所示:

function setName(name){this.name=name}; setName.apply(jack,["jack Recpt"]); print(printName.call(jack));

打印为jack Recpt 
apply的第二个参数为函数需要参数组的一个数组;

setName.call(rose,"rose jizz ");print(printName.call(rose));

打印为rose jizz
call需要若干个参数,参数以逗号分割开。

 

抱歉!评论已关闭.