• (九)JavaScript之【JS函数(定义、参数、调用、【闭包】、call(),apply())】[较深,胆小勿进]


    一】、定义:

     1 /**
     2  * 函数表达式
     3  *
     4  * Function() 构造函数
     5  *
     6  * 函数提升(Hoisting)
     7  * JavaScript默认将当前作用域提升到前面去
     8  * Hoisting应用在变量的声明和函数的声明
     9  * 【使用表达式定义函数时无法提升】
    10  *
    11  * 自调用函数
    12  *
    13  * 函数是对象*/
     1 //函数表达式储存在变量中
     2 var x = function () { return 'message'; };
     3 
     4 console.log(x());
     5 
     6 /**
     7  以上函数实际上是一个 匿名函数 (函数没有名称)。
     8  函数存储在变量中,不需要函数名称,通常通过变量名来调用。
     9  上述函数以分号结尾,因为它是一个执行语句。
    10  */
    1 //不建议。在 JavaScript 中,很多时候,你需要避免使用 new 关键字。
    2 var myFunction = new Function('a', 'b', 'return a*b');
    3 console.log(myFunction(3, 4));
    1 //函数提升
    2 //在函数声明之前调用
    3 myFunction();
    4 
    5 function myFunction() {
    6     console.log(233);
    7 }
    1 //自调用函数,是一个表达式,有括号把表达式括起来
    2 (function () {
    3     console.log('Hello'); //我将调用我自己
    4 })();
     1 //函数是对象,函数有属性和方法
     2 console.log(typeof(function add() {})); //function
     3 
     4 //arguments.length 属性返回函数调用过程接收到的参数个数
     5 //arguments是JavaScript的内置对象
     6 function myFunction(a, b){
     7     console.log(arguments.length);
     8 }
     9 
    10 myFunction(1, 2); //2
    11 myFunction(); //0
    12 myFunction('test'); //1
    13 
    14 //总结:
    15 //函数定义作为对象的属性,称之为对象方法。
    16 //函数如果用于创建新的对象,称之为对象的构造函数。

     二】、参数

     1 /**
     2  * 函数参数
     3  *
     4  * arguments 对象
     5  * arguments对象包含了函数调用的参数数组
     6  * */
     7 
     8 /**
     9  * 如果函数在调用时缺少参数,参数会默认设置为: undefined
    10  有时这是可以接受的,但是建议最好为参数设置一个默认值*/
    function add(x, y){
        if(y === undefined) {
            y = 0;
        }
        //或者:
        //y = y || 0;
        //如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。
        console.log( x + y);
    }
    
    add(2);
    console.log(Boolean(undefined)); //false
     1 //查找最后一个参数的值
     2 function findMax() {
     3     var maxNum = 0;
     4 
     5     for(var i = 0;i < arguments.length;i++) {
     6         if(arguments[i] > maxNum) {
     7             maxNum = arguments[i];
     8         }
     9     }
    10     console.log(maxNum);
    11 }
    12 findMax(4,5,6); //6
    1 function sumAll() {
    2     var sum = 0;
    3 
    4     for(var i = 0;i < arguments.length;i++) {
    5         sum += arguments[i];
    6     }
    7     console.log(sum);
    8 }
    9 sumAll(4,5,6); //15

     三】、调用

     1 /**
     2  * 函数的调用:
     3  *
     4  * 1.作为一个函数调用
     5  *
     6  * 2.作为对象的方法调用
     7  *
     8  * 3.构造函数new调用函数
     9  *
    10  * 4.call()、apply()调用函数
    11  * call([thisObj[,arg1[, arg2[,   [,.argN]]]]])
    12  * call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
    13  如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 */
    14 
    15 
    16 var myObject = {
    17     myName: 'lqc',
    18     myPets: ['HuaDou', 'ErBao'],
    19     fullInformation: function () {
    20         return this.myName + ' have ' + this.myPets[1];
    21     }
    22 };
    23 
    24 console.log(myObject.fullInformation());
    25 
    26 function multiply(a, b) {
    27     return a*b;
    28 }
    29 
    30 console.log(multiply.call(myObject, 5, 6));
    31 console.log(multiply.apply(myObject, [5, 6]));

    四】、闭包

    闭包:
    私有变量可以用到闭包

     1 // 计数菌
     2 var add = (function (){
     3     var counter = 0;
     4 
     5     return function () {
     6         return counter++;
     7     };
     8 
     9 })();
    10 
    11 console.log(add());
    12 console.log(add());
    13 console.log(add());
     1 //定义多个嵌套函数
     2 function counter() {
     3     var counter = 0;
     4 
     5     return {
     6         count: function () {
     7             return counter++;
     8         },
     9         reset: function () {
    10             return counter = 0;
    11         }
    12     };
    13 }
    14 
    15 var c1 = counter();
    16 var c2 = counter();
    17 
    18 console.log(c1.count());
    19 console.log(c1.count());
    20 console.log(c1.count());
    21 
    22 console.log(c2.count());
    23 console.log(c2.count());
    24 console.log(c2.reset());

    五】、call()方法和apply()方法

    参考:http://www.cnblogs.com/lqcdsns/p/5349496.html

  • 相关阅读:
    分类算法 学习笔记
    机器学习概述 & 特征工程 学习笔记
    Java基础知识
    牛客中Java工程师模拟面试整理
    leetcode142. 环形链表 II
    面经中的题目整理
    面经总结
    软件设计师补题(2007下半年上午题)
    软件设计师补题(2005上半年上午题)
    软件设计师补题(2005下半年上午题)
  • 原文地址:https://www.cnblogs.com/lqcdsns/p/5351184.html
Copyright © 2020-2023  润新知