JavaScript函数

函数是这样的一段JavaScript代码,它只定义一次,但可能被执行或调用任意次。

函数使用function关键字来定义,它可以用在函数定义表达式或者函数声明语句里

在JavaScript里,函数即对象,程序可以随意操控它们。比如,JavaScript可以把函数赋值给变量,或者作为参数传递给其他函数。因为函数就是对象,所以可以给它们设置属性,甚至调用它们的方法。

如果一个函数不包含return语句,那它就只执行函数体中的每条语句,并返回undefined值给调用者。

构成函数主体的JavaScript代码在定义之时并不会执行,只有调用该函数时,它们才会执行。

当方法并不需要返回值时,最好直接返回this。如果在设计的API中一直使用这种方式(每个方法都返回thls},使用API就可以进行“链式调用”的风格编程。注意:如果嵌套函数作为方法调用,其this的值指向调用它的对象

不必检查实参个数。大多数情况下JavaScript的默认行为是可以满足需要的,省略的实参都将是undefined,多出的参数会自动省略。

在函数体内,标识符arguments是指向实参对象的引用(严格模式无法使用),arguments[0]和x指代同一个值,修改其中一个的值会影响到另一个。

var asdf = {
a:1,
d:function(a){
    arguments[0]="ccc";
    alert(a);          //结果输出 "ccc" , arguments[0]与a的引用是一致的
            alert(a === arguments[0]);          //结果输出true,说明是一致的
        }
} asdf.d("111");

arguments对象还定义了callee和caller属性。ECMAScript标准规范规定callee属性指代当前正在执行的函数。

作为值的函数

函数可以定义,也可以调用,这是函数最重要的特性。然而在JavaScript中,函数不仅是一种语法,也是值,也就是说,可以将函数赋值给变量,存储在对象的属性或数组的元素中,作为参数传人另外一个函数等

function square(){return 666;}
var s=square;                 //S和square指代同一个函数
s();square();                 //一样的都是返回666

函数的自我执行

如果这个方法只用到一次,可以定义一个匿名函数,并在单个表达式中调用它:

(function(){            //这是一个没有名字的匿名函数
       document.write('hahahaha');
}());        ////结束函数定义并立即调用它,多了两个圆括号 

这种写法非常常见,已经成为一种惯用法了。注意上面代码的圆括号的用法,function之前的左圆括号是必需的,因为如果不写这个左圆括号,JavaS cript解释器会试图将关键字function解析为函数声明语句。使用圆括号JavaScript解释器才会正确地将其解析为函数定义表达式。使用圆括号是习惯用法,尽管有些时候没有必要也不应当省略。这里定义的函数会立即调用。

函数的闭包

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为“闭包”
当一个函数嵌套了另外一个函数,外部函数将嵌套的函数对象作为返回值返回的时候往往会发生这种事情。有很多强大的编程技术都利用到了这类嵌套的函数闭包,以至于这种编程模式在JavaScript中非常常见。当你第一次碰到闭包时可能会觉得非常让人费解,一旦你理解掌握了闭包之后,就能非常自如地使用它了,了解这一点至关重要。
理解闭包首先要了解嵌套函数的词法作用域规则。

var scope ="scope";       //全局变量  scope
function c(){
    var scope ="neibu";               //局部变量 neibu
    function f(){return scope;};       //在作用域中返回这个值
    return f();
}
alert(c());        // =>   输出的是 neibu  

call()方法和apply()方法
call()和apply()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用。要想以对象。的方法来调用函数f(),可以这样使用call()和apply():
f.call(o);
f.apply(o);
每行代码和下面代码的功能类似(假设对象中预先不存在名为m的属性)
o.m=f; //将f存储为。的临时方法
o.m(); //调用它,不传入参数
delete o.m; //将临时方法删除
对于call()来说,第一个调用上下文实参之后的所有实参就是要传入待调用函数的值。

bind()方法

bind()是在ECMAScript 5中新增的方法,但在ECMAScript 3中可以轻易模拟bind()..名字就可以看出,这个方法的主要作用就是将函数绑定至某个对象。

function f(y){return this.x+Y}}    //这个是待绑定的函数
var o = {x:1};    //将要绑定的对象
var g=f.bind(o);     //通过调用g(x)来调用o.f(x)
g(2)    //  =>  3

Function()构造函数

不管是通过函数定义语句还是函数直接量表达式,函数的定义都要使用function关键字。
var f= new Function(“x”, “y”, “return x*y;”);
这一行代码创建一个新的函数,这个函数和通过下面代码定义的函数几乎等价:
var f=function (x, y){return x*y;};

顶层函数(全局函数)

函数 描述
decodeURI() 解码某个编码的 URI。
decodeURIComponent() 解码一个编码的 URI 组件。
encodeURI() 把字符串编码为 URI。
encodeURIComponent() 把字符串编码为 URI 组件。
escape() 对字符串进行编码。
eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。
getClass() 返回一个 JavaObject 的 JavaClass。
isFinite() 检查某个值是否为有穷大的数。
isNaN() 检查某个值是否是数字。
Number() 把对象的值转换为数字。
parseFloat() 解析一个字符串并返回一个浮点数。
parseInt() 解析一个字符串并返回一个整数。
String() 把对象的值转换为字符串。
unescape() 对由 escape() 编码的字符串进行解码。

发表评论

发表回复

*

沙发空缺中,还不快抢~