美文网首页
【js致死点】函数

【js致死点】函数

作者: 南方帅 | 来源:发表于2019-02-26 18:08 被阅读0次

    函数定义有两种方式 函数声明和函数表达式(new function 不考虑) , 两者的区别就是:

    用函数声明创建的函数可以在函数解析后调用(解析时进行等逻辑处理);而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用。

    Javascript 中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。这个微小的区别,可能会导致JS代码出现意想不到的bug,让你陷入莫名的陷阱中。

    f();
    var f = function (){};
    // TypeError: undefined is not a function
    // 等同于
    var f;
    f();
    f = function () {};
    
    • length 返回函数预期传入的参数个数
    • 作用域

    函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是声明所在的作用域,与其运行的作用域无关

    var x = function () {
      console.log(a);
    };
    
    function y(f) {
      var a = 2;
      f();
    }
    
    y(x)
    // ReferenceError: a is not defined
    
    • 函数传值

    参数如果为值的话,不会污染之前的变量。如果是传址的引用类型的话。就会影响的原始值

    var obj = { p: 1 };
    
    function f(o) {
      o.p = 2;
    }
    f(obj);
    
    obj.p // 2
    

    BUT如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。 直接赋予新值,和原数据没有关系。不会影响原数据

    var obj = [1, 2, 3];
    
    function f(o) {
      o = [2, 3, 4];
    }
    f(obj);
    
    obj // [1, 2, 3]
    
    • 闭包

    闭包是javascript 中的一个难点,简单的理解就是定义在一个函数内部的函数。闭包最大的特点,就是它可以记住诞生的环境。这样就可以将函数内部和函数外部连接起来。
    闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在

    function createIncrementor(start) {
      return function () {
        return start++;
      };
    }
    
    var inc = createIncrementor(5);
    
    inc() // 5
    inc() // 6
    inc() // 7
    

    为什么会这样呢?原因就在于inc始终在内存中,而inc的存在依赖于createIncrementor,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收

    • 为了避免污染全局变量 IIFE
    (function(){
      var tmp = newData;
      processData(tmp);
      storeData(tmp);
    })()
    // 或者在前面加上`* ~ - +` 这些符号
    

    相关文章

      网友评论

          本文标题:【js致死点】函数

          本文链接:https://www.haomeiwen.com/subject/yopoyqtx.html