后端重新学习前端的第三天

类型转换

typeof用于检测一个变量的类型,具体值为

typeof null = 'object'
typeof [] = 'object'
typeof NaN = 'number'
typeof 1 = 'number'
typeof '' = 'string'
typeof true = 'boolean'
typeof {} = 'object'
typeof function(){} = 'function'
复制代码

隐式类型转换一般发生于数值操作,例如:

+true = 1
+'' = 0
1 * '22' = 22
1 + '22' = '122' // 非隐式类型转换
复制代码

总的来说,对于''、false、undefined、null、NaN、0,会在条件语句中判断为false

var x = 1;
if (function f(){}) {
  x += typeof(f)
}
console.log(x); // 由于if内的函数f不会提升,所以f类型为undefined,则x值为1undefined
复制代码

运算符优先级()运算符优先级最大

作用域和作用域链

作用域链是一个栈,越晚产生的离栈顶越近,而寻找变量时,会从栈顶向下找,即从当前作用域一直找到最外层作用域,知道变量被找到或找到全局作用域位置。

函数定义时,内部作用域会继承之前已经存在的作用域

function a (){
  function b (){
    var bbb = 234;
    console.log(aaa);
  }
  var aaa = 123;
  return b;
}
var glob = 100;
var demo = a();
demo();
// b定义时的作用域:a的AO和GO
// b执行时的作用域:a的AO和GO、b的AO
// 所以此题,aaa为123
复制代码

所以产生闭包时,函数的作用域即函数定义时的作用域

闭包的定义:内部的函数或变量被保存到了外部,此时就产生了闭包

function a() {
  var num = 100;
  function b() {
    num ++;
    console.log(num);
  }
  window.b = b; // 这种做法也会产生闭包;
  return b;
}

var demo = a();
demo(); // 101
demo(); // 102
demo(); // 103
demo(); // 104
demo(); // 105
// 由于b被保存到了外部,此时产生了闭包,b会继承a的作用域,所以b此时的作用域内仍有num,所以num被保存到了外部,这样每一次返回的函数被执行时,num都会+1
复制代码

闭包的危害:导致原作用域链不被释放,造成内存泄露

闭包作用:

​ 1、实现共有变量

​ 2、缓存

​ 3、实现封装,属性私有化

​ 4、模块化开发,防止污染全局变量

function eater() {
  var food = "";
  var obj = {
    eat: function () {
      console.log("I am eating " + food);
      food = "";
    },
    push: function (myFood) {
      food = myFood;
    }
  }

  return obj;
}


var eat = eater();
eat.push("apple")
eat.eat() // I am eating apple
复制代码

立即执行函数

只执行一次的函数叫做初始化函数,而立即执行函数是执行一个函数之后马上释放该函数,避免消耗空间。

!(function(a1, a2, a3) {
  var a = 123;
  var b = 234;
  console.log(a + b);
  console.log(a1, a2, a3);
})(1, 2, 3)
复制代码

立即执行函数有两种:

(function() {}()); // 推荐
(function() {})();
复制代码

对于函数:函数表达式能立即执行,而函数声明不可以,能被执行符号执行的函数,他的函数名字可以被忽略。这个时候这个函数就可以成为立即执行函数

var test = function() {
	console.log('aaa');
}()
// 转换之后为
var test = (function(){
  console.log('aaa')
}())
复制代码

所以只要能让函数声明转为表达式,都能让其成为一个立即执行函数,常见的如:逻辑的,以及()

+function() {
  console.log('a');
}()
-function() {
  console.log('a');
}()
!function() {
  console.log('a');
}()
复制代码

javascript中能够让函数声明成为表达式的有如下几种:

1、定义表达式:var a = function(){}()

2、初始化表达式:{ a: function(){}() }

3、访问表达式:({a: function(){}}).a()

4、调用表达式:!function(){}()

5、实例化表达式:new function(){}

逗号表达式

逗号表达式即以逗号作为分隔符的表达式,它总会返回该表达式的最后一个值,如下所示

var a = (1, 2, 3),此时a的值为3

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享