【js致死点】函数

2019-02-26  本文已影响0人  南方帅

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

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

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

f();
var f = function (){};
// TypeError: undefined is not a function
// 等同于
var f;
f();
f = function () {};

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

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,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收

(function(){
  var tmp = newData;
  processData(tmp);
  storeData(tmp);
})()
// 或者在前面加上`* ~ - +` 这些符号
上一篇下一篇

猜你喜欢

热点阅读