Javascript 函数总结

函数的定义

函数名称只能包含字母、数字、下划线或$,且不能以数字开头。定义时可用函数定义表达式或者函数声明语句。

var f = function fact(x){}

函数定义表达式包含名称,名称将作为函数的局部变量,在函数内部使用,代指函数。

函数声明语句不是真正的语句,不能出现在循环、条件、try/catch/finally以及with语句中;声明语句置于在不会执行到的位置仍可被整个作用域可访问,可在被定义代码之前使用。定义表达式的变量声明被提前了,但是对变量赋值不会提前,函数在被定义之前无法使用,否则调用时会出现错误:"TypeError: undefined is not a function"

return语句没有一个与之相关的表达式,则它返回undefined值;如果一个函数不包含return语句,那它只执行函数体内语句,并返回undefined给调用者;没有返回值的函数,有时称为过程。

函数执行

函数执行的几种方式,当作函数、方法、构造函数、间接调用。如果构造函数没有形参,可以省略实参列表和圆括号,调用函数传实参有间隔时,可用null或undefined占位符替代空白的参数。

function MyClass(name) {
    this.name = name;
    return name;  // 构造函数的返回值?
}

var obj1 = new MyClass(‘foo‘);// MyClass对象
var obj2 = MyClass(‘foo‘);// ‘foo’
var obj3 = new MyClass({});// {}
var obj4 = MyClass({});// {}

实参对象

实参对象是类数组对象,可用arguments.callee递归调用,如果你把参数命名为arguments,那么这个参数就会覆盖它原有的特殊变量。

函数的形参和实参

定义的函数括号内靠后面的形参没传入相应的实参,则默认值为undefined,有人利用这个,隐式定义函数内部的局部变量。函数传入参数的校验及抛出错误,函数中实参传入的是引用,函数内部对其操作,对外部是可见的。

// 函数传参引用
var oo = {
    x: 1, y: 2, get z() {
        return 3;
    }
}

function fns(obj) {
    obj.h = 4;
}

fns(oo);

函数属性、方法

函数也是对象,所以也有属性和方法,函数的length属性,函数形参的个数。

apply方法的第二个参数可以是数组或类数组对象。

bind方法是ES5中新增,将函数“绑定至”对象并传入一部分参数,传入的实参放在完整实参列表的左侧。

/**
 * ES5.0支持bind函数,ES3.0不支持bind,这里在ES3中模拟实现,能应用于大部分场景,
 * 如有问题,欢迎一起探讨
 * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
 */
Function.prototype.bind || (Function.prototype.bind = function (that) {
    var target = this;
    // If IsCallable(func) is false, throw a TypeError exception.
    // 通过call、apply调用时,校验传入的上下文
    if (typeof target !== ‘function‘) {
        throw new TypeError(‘Bind must be called on a function‘);
    }

    var boundArgs = slice.call(arguments, 1);

    function bound() {
        // 返回的bind函数被当构造函数
        if (this instanceof bound) {
            var self = createObject(target.prototype);
            var result = target.apply(
                self,
                boundArgs.concat(slice.call(arguments)));
            // Object(result) === result 判断调用返回是不是对象
            return Object(result) === result ? result : self;
        }
            // 返回的bind函数以一般函数形式调用
        else {
            return target.apply(
                that,
                boundArgs.concat(slice.call(arguments)));
        }
    }

    // NOTICE: The function.length is not writable.
    bound.length = Math.max(target.length - boundArgs.length, 0);
    return bound;
});

高阶函数

如果函数作为参数或返回值使用时,就称为高阶函数。

作为命名空间的函数

函数命名空间暴露接口有以下几种方法

var mylib = (function (global) {
    function log(msg) {
        console.log(msg);
    }
    log1 = log;  // 法一:利用没有var的变量声明的默认行为,在log1成为全局变量(不推荐)
    global.log2 = log;  // 法二:直接在全局对象上添加log2属性,赋值为log函数(推荐)
    return {  // 法三:通过匿名函数返回值得到一系列接口函数集合对象,赋值给全局变量mylib(推荐)
        log: log
    };
}(window));

自更新函数

function selfUpdate() {
    window.selfUpdate = function () {
        alert(‘second run!‘);
    };

    alert(‘first run!‘);
}

selfUpdate(); // first run!
selfUpdate(); // second run!

这种函数可以用于只运行一次的逻辑,在第一次运行之后就整个替换成一段新的逻辑。

函数书写规范

函数参数定义的几种注释

/*,...*/
AP.reduce || (AP.reduce = function(fn /*, initial*/) {
    getPropertyNames(o,/*optional*/a) // /*optional*/表示参数可选
    function arraycopy(/*array */ from,/*index*/from_start){};
}

具有记忆功能的函数

/**
 *  记忆函数
 */
function memorize(f) {
    var cache = {};
    return function () {
        var key = arguments.length + ‘‘ + Array.prototype.join.call(arguments, ‘,‘);
        if (!(key in cache))
            cache[key] = f.apply(null, arguments);
        return cache[key];
    }
}
时间: 2024-10-29 20:45:41

Javascript 函数总结的相关文章

ABP展现层——Javascript函数库

ABP展现层——Javascript函数库 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate ASP.NET Boil

C#实现百度地图附近搜索&调用JavaScript函数

前一篇文章"C#调用百度地图API入门&解决BMap未定义问题"讲述了如何通过C#调用百度API显示地图,并且如何解决BMap未定义的问题.这篇文章主要更加详细的介绍百度地图的一些功能,包括附近搜索.城市搜索.路线规划.添加覆盖物等等. 希望文章对你有所帮助!如果文章中有不足之处,还请海涵~ 百度官方文档:http://developer.baidu.com/map/jsmobile.htm 官方DEMO例:http://developer.baidu.com/map/jsde

JavaScript函数,作用域以及闭包

JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义. a. 函数的两种定义方式: * function functionName() {} * var functionName = function(){} b. 两种函数定义不同之处 1). 声明提前问题 函数声明语句   :声明与函数体一起提前 函数定义表达式 :声明提前,但是函数体不会提前 请看下面图示:绿色线上面实在js初始加载的时候,查看

HTML 学习笔记 JavaScript (函数)

函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块 实例 <!DOCTYPE html> <html> <head> <script> function myFunction() { alert("Hello World!"); } </script> </head> <body> <button onclick="myFunction()">点击这里</b

javascript 函数重载 overloading

函数重载 https://en.wikipedia.org/wiki/Function_overloading In some programming languages, function overloading or method overloading is the ability to create multiple methods of the same name with different implementations. Calls to an overloaded functi

第十篇--------javascript函数-参数

javascript函数的参数:形参,实参 //function 参数 //形参列表 function test(a,b,c,d){ //alert(test.length); //形参个数,4个 //函数的实际参数,内部就是用一个数组去接收函数的实际参数 //arguments 对象,可以访问函数的实际参数 //arguments 对象只能在函数的内部使用 alert(arguments.length); //2个 alert(arguments[0]); //10 alert(argumen

javaScript 函数重载

javaScript函数不支持重载.有时我们想像java.C等语言 一样定义 重载的方法,那么 我们就可以用其他的方式去定义 重载的函数. 当然,实现的方式 有好多种,每个人 可能不同.下面 我贴出我的实现及使用方法 和 大家交流. js 源码: /**  * 函数参数重载方法 overload,对函数参数进行模式匹配.默认的dispatcher支持*和...以及?,"*"表示一个任意类型的参数,"..."表示多个任  *意类型的参数,"?"一般

前端笔试题目总结——应用JavaScript函数递归打印数组到HTML页面上

数组如下: var item=[{ name:'Tom', age:70, child:[{ name:'Jerry', age:50, child:[{ name:'William', age:20 }] }, { name:'Jessi', age:30 }]}]; 输出的HTTML如下: 1 <ol> 2 <li>name:Tom</li> 3 <li>age:70</li> 4 <li>children: 5 <ol&g

2015第37周五javascript函数arguments对象巧用一

Javascript函数的一个巧妙利用:假定action中有一个JSONObject类型的对象data,其值有可能为空,则前台JSP页面的JS代码中想直接通过EL表达式,即${data}的形式访问对象的值,则可能会因为data对象为空导致JS预处理错误,如JSP中有这样的代码,var obj=${data};,则当后台data为null时前台页面会变成var obj=;进而页面报错终止运行.有人想通过类似 var obj=('${data}'==''?{}:${data})来解决,但该代码依旧编

被括号括住的JavaScript函数

在JavaScript经常会看到这样的代码 ( function( $ ){ $( 'body' ).css( { 'background-color': '#ccc' } ); } )( jQuery ); 这里的一个JavaScript函数被一个括号括了起来, 然后后面紧跟着一个括号,这种奇葩的写法在其它如Java.VB.c#.c++.php等流行编程语言中根本见不到.这种写法乍一看是JavaScript特意增加的新奇特性, 其实并不是. 在我们编写任何程序时,时时刻刻在用到与上面代码类似的