原文:Javascript学习5 - 函数

在Javascript中,函数和对象是交织在一起的。有些函数的特性与对象相关联。这一点的内容在第六部分会讨论到。
这一部分主要讨论函数与其它比较熟悉的语言(如C/C++)不同的地方

5.1 函数定义
    function 函数名(参数1,参数2...)
    {
        主体;
    }
    函数内可以有return,也可以没有return. 没有return时,函数返回undefined值。
    另外,Javascript是类型宽松的语言,所以,对于函数调用时传递参数,有以下特性:
    ① Javascript不会检测传递的数据是不是函数要求的类型。
        如果参数的数据类型很重要,可以在函数内用typeof运算符进行检测
    ② Javascript不会检测传递给它的参数是否正确。
        如果传递的参数比需求的个数多,多余的值被忽略。
        如果传递的参数比需求的个数少,所忽略的几个参数被赋于undefined值
    ③ 函数内部有个Arguments对象维护着实际传递给函数的参数。
        用它可以实现得到实际传递给函数的参数个数,及参数值。用于实现可变参数函数。

5.2 嵌套函数
    实现如下:

function hypotenuse(a, b) {   function square(x) { return x*x; }   return Math.sqrt(square(a) + square(b));} 

5.3 函数参数
    ● 可选参数
        因为不会检测传递给它的参数是否正确,所以,可以忽略到相应的参数来达到可选参数的目的。

function copyPropertyNamesToArray(o, /**//* optional */ a) {    if (!a) a = [];  // If undefined or null, use a blank array    // 以上语句也可以这样写 a = a || [];    for(var property in o) a.push(property);    return a;} 

● 可变参数
        在一个函数体内,标识符arguments具有特殊含义。它是引用arguments对象的一个特殊属性。
        其类似一个数组的对象,可以按照数目获取传递给函数的参数值。
        arguments具有length属性,可以获得实际传递给函数的参数个数
        取得第一个参数值,可以使用argments[0]来获得。

 1function max(/**//*  */) 2{ 3    var m = Number.NEGATIVE_INFINITY; 4    // Loop through all the arguments, looking for, and 5    // remembering, the biggest 6    for(var i = ; i < arguments.length; i++) 7         if (arguments[i] > m)  8            m = arguments[i]; 9            // Return the biggest         return m;} 

arguments具有callee属性,引用当前正在执行的函数。
        arguments并非真正的数组,它是一个Arguments对象。
5.4 作为数据的函数
    函数最重要的就是它们能够定义和调用,定义和调用是Javascript和大多数程序语言的语法特性。
    但是,在Javascript中,函数并不只是一种语法,其也可以作为数据来看待。这意味着,可以把函数赋给变量,存储在对象的属性或数组元素中,作为参数传递给函数等。
    例1:函数赋值给变量:

function square(x) { return x*x; }var a = square();  // a contains the number 16var b = square;     // Now b refers to the same function that square does 

例2:存储在对象的属性或数组元素中

var o = new Object;o.square = function(x) { return x*x; }       // function literaly = o.square();  var a = new Array();a[] = function(x) { return x*x; } 

关于这点,可以参考《Javascript权威指南》8.3节最后例举的一个例子。

5.5 作为方法的函数及this关键字
    对象的方法只不过是对象的一个属性,且该属性引用的是函数类型而已。
    因为函数可以赋给任何变量,可以赋给一个对象的任何属性。

var calculator = {  // An object literal   operand1: ,   operand2: ,   compute: function() {       this.result = this.operand1 + this.operand2;   }};calculator.compute();       // What is 1+1?print(calculator.result);   // Display the result 

以上,this关键字很重要,任何作方法的函数都被有效的传递了一个隐式的参数,即调用函数的对象(this).

5.6 函数的属性和方法
    函数是Javascript对象的一种特殊类型,typeof运算符用于函数类型时会返回字符串“function”
    既然函数是对象,它就具有属性和方法,就像其它的对象一样。
    ● 属性lenght
        不同于函数体内arguments的length属性,函数自身的length属性是一个只读属性,返回的是函数需要的实际参数数目。
    ● 定义函数自身的属性,具有static属性

 1// Create and initialize the "static" variable. 2// Function declarations are processed before code is executed, so 3// we really can do this assignment before the function declaration. 4uniqueInteger.counter = ; 5 6// Here's the function. It returns a different value each time 7// it is called and uses a "static" property of itself to keep track 8// of the last value it returned. 9function uniqueInteger() {    return uniqueInteger.counter++;  // Increment and return our "static" variable} 

● 方法 apply() 和 call()
        这两个方法可以像调用其它方法一样调用函数。第一个参数都是要调用的函数对象,函数体内这一参数是关键字this的值。
        call的剩余参数是传递给要调用的函数的值。
        to the function f() and invoke it as if it were a method of the object o, you could use code like this:
            f.call(o, 1, 2);
        This is similar to the following lines of code:
            o.m = f;
            o.m(1,2);
            delete o.m;
        The apply() method is like the call() method, except that the arguments to be passed to the function are specified as an array:
            f.apply(o, [1,2]);
        For example, to find the largest number in an array of numbers, you could use the apply() method to pass the elements of the array to the Math.max() function:
            var biggest = Math.max.apply(null, array_of_numbers);

Javascript学习5 - 函数的更多相关文章

  1. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  2. Javascript学习之函数(function)

    在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...

  3. JavaScript学习笔记——函数

    javascript函数的声明和调用 将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法 function 关键字 function 函数名([参数1] ...

  4. JavaScript学习笔记-函数

    函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...

  5. JavaScript学习笔记-函数实例

    函数实例 var p = { a:15, b:'5', f1:function(){ var self = this; console.log(self.a+self.b); f2(); functi ...

  6. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  7. JavaScript学习03 JS函数

    JavaScript学习03 JS函数 函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionName() { 这里是要执行的代码 } 函数参数 函数的 ...

  8. JavaScript学习总结-技巧、有用函数、简洁方法、编程细节

    整理JavaScript方面的一些技巧.比較有用的函数,常见功能实现方法,仅作參考 变量转换 //edit http://www.lai18.com var myVar = "3.14159 ...

  9. JavaScript学习笔记(七)——函数的定义与调用

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

随机推荐

  1. gif动图快速制作方法(附工具)(转)

    现在写博客或是wiki的过程中,会经常引用到图片,特别是客户端经常与页面相关所以截图不可避.但是越来越多的效果仅仅一张图片是无法清楚的描述.并且博客或是wiki也是支持gif图的.gif图的制作方法有 ...

  2. css--左右visibility建立 “collapse”值问题

    1.您可能已使用visibility一千次,最常用的是visible和hidden.它用来显示或隐藏元素. 有第三很少已使用的值它是collapse,在表格的行,列中使用有差异外,他和hidden的作 ...

  3. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  4. canvas绘制百分比圆环进度条

    开发项目,PM会跟踪项目进度:完成某个事情,也可以设置一个完成的进度. 这里用canvas绘制一个简单百分比圆环进度条. 看下效果: 1. 动画方式   2. 静默方式   // 贴上代码,仅供参考 ...

  5. [LeetCode203]Remove Linked List Elements

    题目: Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 ...

  6. MongoDB:逐渐变得无关紧要

    我与MongoDB的关系可分为三个阶段.对于目前处于第三阶段的我来说,这款产品似乎变得无关紧要了.很快你就会明白为什么我这么说. 阶段一:痴迷 我与MongoDB的第一次接触十分神奇:一个poligl ...

  7. Spark SQL源代码分析之核心流程

    /** Spark SQL源代码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几 ...

  8. C语言探索之旅】 第一部分第四课第三章:变量的世界之显示变量内容

    内容简介 1.课程大纲 2.第一部分第四课第三章:变量的世界之显示变量内容 3.第一部分第五课预告:基本运算 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用 ...

  9. opencv2对于读书笔记——背投影图像的直方图来检测待处理的内容

    一些小的概念 1.直方图是图像内容的一个重要特性. 2.假设一幅图像的区域中显示的是一种独特的纹理或是一个独特的物体,那么这个区域的直方图能够看作是一个概率函数,它给出的是某个像素属于该纹理或物体的概 ...

  10. Mysql 5.6 新特性

    随笔,真的随笔,以后理解得更深了再修改.   Index Condition Pushdown 更多的让存储引擎去处理Where语句中的条款,避免返回无关字段数据等:   Multi-Range Re ...