• 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);
  • 相关阅读:
    CLR基础
    Windows7下使用Shell32.dll出现没有实现接口的错误的解决办法
    Python学习
    Python学习
    开发常识之Linux用户及其权限管理
    (转)简单明晰的Jupyter Notebook总结与指南
    Oracle系列数据库版本区别
    应用场景区别-MongoDB与MySQL的选择比较
    我的博客(个人空间)地址更新说明
    (转)Spark与Map-Reduce区别对比
  • 原文地址:https://www.cnblogs.com/lijy/p/6602330.html
Copyright © 2020-2023  润新知