卓越2008

用一颗谦虚的心面对大家,用一颗坚定的心面对困难,用一颗执著的心面对理想,用一颗虔诚的心面对技术。

导航

2007-11-21

Posted on 2007-11-27 08:51  Casm  阅读(187)  评论(0)    收藏  举报

当一个函数在对象上被调用的时候,这个函数就叫做方法,它的调用对象就会当作函数的一个隐式的参数来传递

如果函数的return语句没有一个相关的表达式,它就返回undefined,或者函数没有return语句,就会返回给调用者一个undefined

如果参数的类型对函数很重要,那么可以运用typeof对它进行检测,js也不会检测传递给它的参数个数是否正确,如果传递的参数比函数需要的个数多,那么多余的值会被忽略掉,如果传递的参数比函数需要的个数少,那么所忽略的几个参数会被赋予undefined值

在js中函数可以嵌套在其他函数中,被嵌套的函数有可能只在它所签入的函数内的最顶层定义,也就是说有可能不会定义在语句块中像if等

函数直接量:

var f = function(x) { ... }

var f = function fact(x) { ... }

第2个定义了一个未命名函数,并把对它的引用存储在变量f中,它并没有把对函数的引用存储到名为fact的变量中,而只是允许函数体用这个名字来引用自身

在世哦那个可选参数来设计函数时,应该确保把可选的参数放在参数列表末尾,以便他们可以忽略掉

在一个函数体内,标识符arguments具有特殊含义,它是引用arguments对象的一个特殊属性,Argements对象是一个类似数组的对象,可以按照数目获取传递给函数的参数值,这样一来就可以传递任意数目的参数了,Arguments对象允许完全地存储那些实际参数值,即使某些参数还没有被命名,它具有一个length属性表示参数个数,通常还可以使用它来检查参数传递是否正确,它并非数组而是一个Arguments对象

Arguments对象有一个非同寻常的特性,当函数具有命名了的参数时,Arguments对象的数组元素是存放函数参数的局部变量的同义词,arguments[]和命名了的参数不过是引用同一变量的两种不同方式,相反,用参数名改变一个参数的值同时会改变arguments[]数组获得的值,反之亦然

arguments是标识符而不是保留字,如果函数有一个参数为arguments,它就会隐藏对Arguments对象的引用

Arguments对象还定义了callee属性,用来引用当前正在执行的函数,它可以用来允许对未命名函数递归调用自身

function(x)

{

if (x == 1)

{

return 1;

}

return x * arguments.callee(x - 1);

}

a instanceof Array 判断a是否Array对象的一个实例

在方法体中,用来调用方法的对象成为关键字this的值,比如调用o.m()时, 方法可以使用this关键字来引用对象o

当一个函数作为函数而不是作为方法的时候,这个this关键字引用全局对象,当一个嵌套的函数(作为函数)在一个包含的函数之中调用,而这个包含的函数是作为方法调用,this关键字在包含的函数中有一个值,但是它却引用嵌套函数体的内部的全局对象

new运算符创建一个新的对象,然后调用构造函数,把新创建的对象作为this关键字的值来传递

函数自身的length属性是只读的,返回的是函数需要的实际参数数目,且这个属性在函数的内部以及外部都有效

函数的属性prototype,它引用的是预定义的原型对象,原型对象在使用new运算符把函数作为构造函数时起作用

当函数需要使用一个在调用过程中都保持不变的值时,使用Function对象的属性比定义全局变量更加方便,functionObject.attName

函数定义了两个方法call()和apply(),使用这两个方法可以像调用其他对象的方法一样调用函数,第一个参数都是要调用函数的对象,函数体内这一参数是关键字this的值,call()剩余的参数是传递给要调用的函数值,apply()和call()方法类似,只不过要传递给函数的参数是由数组指定的f.apply(object, [1, 2]);

js中的函数是通过词法来划分作用域的,而不是动态划分作用域的,这意味着,它们在定义它们的作用域里运行,而不是在执行他们的作用域里运行,当定义了一个函数,当前的作用域链就保存起来,并且成为函数的内部状态的一部分,在最顶级作用域链仅由全局对象组成,而并不和词法作用域相关,然而,当定义一个嵌套的函数时,作用域链就包括外围的包含函数,这意味着嵌套的函数可以访问包含函数所有的参数和局部变量

当js解释器调用一个函数,它首先将作用域设置为定义函数的时候起作用的作用域链,接下来,它在作用域的前面添加一个新的对象,这个对象叫做调用对象,调用对象用一个名为arguments的属性来初始化,这个属性引用了函数的Arguments对象,函数的命名对象添加到调用对象的后面,用var语句声明的任何局部变量也定义在这个对象中,既然这个调用对象位于作用域链的前端,局部变量,函数参数以及Arguments对象都在函数的作用域中,当然,这也意味着它们隐藏了作用域链更上层的任何同名属性

<闭包>

Function()构造函数需要注意的几点:

Function()构造函数允许javascript代码被动态的创建并且在运行时编译

Function()构造函数解析函数体,并且每次被调用的时候都创建一个新的函数对象,如果构造函数调用出现在一个循环中,那么效率就低了

Function()构造函数创建的函数并不适用词法作用于,相反,它们总是作为顶层的的函数一样来编译