Javascript学习5 - 函数

原文:Javascript学习5 - 函数

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

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

5.2 嵌套函数
    实现如下:

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

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

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

    ● 可变参数
        在一个函数体内,标识符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 = 0; i < arguments.length; i++)
 7         if (arguments[i] > m) 
 8            m = arguments[i];
 9            // Return the biggest
10         return m;
11}

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

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

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

1var o = new Object;
2o.square = function(x) { return x*x; }       // function literal
3y = o.square(16);  
4var a = new Array(3);
5a[0] = function(x) { return x*x; }

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

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

1var calculator = {  // An object literal
2   operand1: 1,
3   operand2: 1,
4   compute: function() {
5       this.result = this.operand1 + this.operand2;
6   }
7};
8calculator.compute();       // What is 1+1?
9print(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 = 0;
 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() {
10    return uniqueInteger.counter++;  // Increment and return our "static" variable
11}

    ● 方法 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);

时间: 2024-11-20 15:41:47

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

javascript学习笔记(四)function函数部分_基础知识

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. Jscript 支持两种函数:一类是语言内部的函数(如eval() ),另一类是自己创建的. 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量. 函数的调用方式 1.普通调用:functionName(实际参数...) 2.通过指向函数的变量去调用: var  myVar

JavaScript学习笔记(三):JavaScript也有入口Main函数_javascript技巧

在C和Java中,都有一个程序的入口函数或方法,即main函数或main方法.而在JavaScript中,程序是从JS源文件的头部开始运行的.但是某种意义上,我们仍然可以虚构出一个main函数来作为程序的起点,这样一来不仅可以跟其他语言统一了,而且说不定你会对JS有更深的理解. 1. 实际的入口 当把一个JavaScript文件交给JS引擎执行时,JS引擎就是从上到下逐条执行每条语句的,直到执行完所有代码. 2. 作用域链.全局作用域和全局对象 我们知道,JS中的每个函数在执行时都会产生一个新的

JavaScript学习小结之被嫌弃的eval函数和with语句实例详解_javascript技巧

前面的话 eval和with经常被嫌弃,好像它们的存在就是错误.在CSS中,表格被嫌弃,在网页中只是用表格来展示数据,而不是做布局,都可能被斥为不规范,矫枉过正.那关于eval和with到底是什么情况呢?本文将详细介绍eval()函数和with语句 eval 定义 eval()是一个全局函数,javascript通过eval()来解释运行由javascript源代码组成的字符串 var result = eval('3+2'); console.log(result,typeof result)

javascript学习笔记之函数定义

  本文主要给大家介绍了javascript的一些函数定义方面的基础知识,包括函数声明式.函数表达式.Function 构造函数等,十分的简单实用,有需要的小伙伴可以参考下. 函数声明式 ? 1 2 3 4 5 function funname( 参数 ){   ...执行的代码   } 声明式的函数并不会马上执行,需要我们调用才会执行:funname(); * 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句,所以不以分号结束. 函数表达式 ? 1 2 3 4 5

Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式_基础知识

函数声明 function foo() {} 函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域)中都是可用的.即使在函数定义之前调用它也没问题. foo(); // Works because foo was created before this code runs function foo() {} 因为我打算专门写篇介绍作用域的文章,所以这里就不详述了. 函数表达式 对于函数声明,函数的名称是必须的,而对于函数表达式而言则是

JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div,for循环绑定事件. 示例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>闭包</title> <style type="

从阶乘函数对比Javascript和C#函数

  今天学习Javascript函数,发现这完全是一个神奇的东西.跟我们平常所见强类型语言中的函数有好多不同.下面我们就从C#和JavaScript的两个计算阶乘的函数中比较两者的异同.        JavaScript代码块 1 <script type="text/javascript"> 2 function factorial(num) { 3 if (num <= 1) { 4 return 1; 5 } else { 6 return num * arg

JavaScript中的函数嵌套使用

  这篇文章主要介绍了JavaScript中的函数嵌套使用,是JavaScript入门学习中的基础知识,需要的朋友可以参考下 在JavaScript1.2之前,函数定义是只允许在顶层全局代码,但1.2的JavaScript可以嵌套函数定义其他函数中也是可以的. 仍然存在的函数定义可以循环或条件之内不会出现限制.在函数定义这些限制只适用于函数声明与函数语句. 函数文本(在JavaScript1.2引入的另一个功能)可能出现在任何JavaScript表达式,这意味着它们可以出现在if else语句内

JavaScript中指定函数名称的相关方法

  这篇文章主要介绍了JavaScript中指定函数名称的相关方法,是JS入门学习中的基础知识,需要的朋友可以参考下 JavaScript1.2引入了函数文本是定义函数一种以上的新方法的概念. 函数文本是定义一个无名函数的表达式. 语法 字面值函数的语法很类似的函数声明,不同之处在于它被用作表达,它不是作为一个声明,函数名是必需的. ? 1 2 3 4 5 6 7 <script type="text/javascript"> <!-- var variablenam