zoukankan      html  css  js  c++  java
  • 3 函数

    ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。

    1 怎么判断传递进来的参数个数呢?

    可以用arguments.length获得:

    function doAdd(){
        if(arguments.length == 1){
            alert(arguments[0] + 10);
        }else if(arguments.length == 2){
            alert(arguments[0] + arguments[1]);
        }
    }
    doAdd(10);
    doAdd(10,20);

    2 分析如下程序的值

    function doAdd(num1, num2){
        arguments[1] = 10;
        alert(arguments[0] + num2);
    }
    doAdd(20, 50);

    :arguments对应的值永远与对应的命名参数(形参)的值保持同步,但它们的内存空间(num2和arguments[1])是独立的。

    结果为30。

    3 创建方式

    常见的创建方式有两种:

    第一种:

    function sum(num1, num2){
        return num1 + num2;
    }

    第二种:

    var sum = function (num1, num2){
        return num1 + num2;
    }

    函数是对象,每个函数都是 Function 类型的实例,与其他引用类型一样具有属性和方法。

    4 作为值调用

    在函数内部,有三个特殊的对象: arguments, this, caller

    写一个阶乘函数,并打印出5的阶乘结果。

    function factorial(num){
        if(num <= 1){
            return 1;
        }else {
            return num * arguments.callee(num - 1);
        }
    }
    console.log(factorial(5));

    5 什么是this?

    this : It is a reference to the context object that the function is operating on

    var color = "red";
    var obj = {color: "blue"};
    function sayColor() {
        document.write(this.color + "</br>");
    }
    sayColor();

    比如,上述程序中,函数sayClolor是在全局环境中运行,那么sayClolor中的this指的是window对象。

    6 apply()和call()方法

    实际上等于设置函数体内 this 对象的值。

    var color = "red";
    var obj = {color: "blue"};
    function sayColor() {
        var color = "green";
        document.write(this.color + "</br>");
    }
    sayColor();
    sayColor.call(obj);

    答案是:

    red

    blue

    当运行sayColor.call(obj)时,sayColor的执行环境已经是在对象obj中,这时sayColor函数中的this指向了对象obj,所以,根据作用域链,自然打印的是obj中的color:blue.

    apply()和call()作用一样,仅仅是参数有所不同。

    注意:使用 call() 或 apply() 来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。

    举个例子:有七个对象person,需要打印出各自的姓名。

    var name = "father";
    var child1 = {name: "A", age:10};
    var child2 = {name: "B", age:12};
    function sayName() {
        document.write(this.name+"<br>");
    }
    sayName();
    sayName.call(child1);
    sayName.call(child2);
  • 相关阅读:
    6、linux中同步、互斥、阻塞(原子操作、信号量、阻塞)
    lightOJ-1199 Partitioning Game (SG函数)
    HDU-1013 Digital Roots
    HDU-1004 Let the Balloon Rise (STL map)
    HDU-1020 Encoding (字符串)
    POJ-2524 Ubiquitous Religions (并查集)
    POJ-1988 Cube Stacking (带权并查集)
    POJ-2236 Wireless Network (并查集)
    HDU-1002 A + B Problem II (模拟大数相加)
    HDU-1829 A Bug's Life (种类并查集)
  • 原文地址:https://www.cnblogs.com/lijy/p/6602330.html
Copyright © 2011-2022 走看看