JavaScript笔记-4

2019-03-26  本文已影响0人  蚂蚁踩死我

作用域

作用域和存在

静态作用域与动态作用域

JavaScript中,作用域是静态的

全局作用域

全局作用域中声明的一切在所有作用域中都可用,所以要谨慎使用全局变量

块作用域

Let 和 const 声明的变量名处在块作用域中

变量屏蔽

独立外部块的同名变量,屏蔽了外部块定义的变量

const obj = {
        color: 'red'
      },
      objCopy = obj,
      number = 100;

function fun() {
    const number = '一百';

    console.log(number);
    objCopy.color = '红色';
}

fun(); //一百
console.log(number); //100
console.log(obj); //{color: "红色"}
console.log(objCopy); //{color: "红色"}

函数、闭包和静态作用域

即时调用函数表达式

(function(){
    
    //代码
  
}) () ;

好处是,任何内部信息都有自己的作用域,并且因为它本身就是函数,它可以向作用域外传递信息。

函数作用域和提升

var 声明的变量,可在当前作用域的任意地方可用,甚至可以在声明前使用

任何使用var声明的变量都会被提升到作用域顶部,提升不是赋值。

/*
 *JavaScript解释下面代码的方式:
 *  
 *  var a ;
 *  var y ;
 *  console.log('第一次打印a :'+a) ;
 *  if(a !== 0){
 *      console.log('第一次打印b :'+b) ;
 *
 *      b = 1 ;
 *
 *        if(b){ a = 0 ;}
 * 
 *      console.log('第二次打印b :'+b) ;
 *  }
 * 
 *  if(a === 0) console.log('第三次打印b :'+b) ;
 */

console.log('第一次打印a :'+a) ;

if(a !== 0){
    console.log('第一次打印b :'+b) ;

    var b = 1 ;

    if(b){ var a = 0 ;}

    console.log('第二次打印b :'+b) ;
}

if(a === 0) console.log('第三次打印b :'+b) ;

同一函数或全局作用域内,var不能用来创建新的变量,变量屏蔽现象也不会出现

//使用var后,变量屏蔽现象不会出现
var number = 1000 ;
if(number === 1000){
    var number = 999 ;
    console.log(number) ;//999
}
console.log(number) ;//999

//使用let
let number = 1000 ;
if(number === 1000){
    let number = 999 ;
    console.log(number) ;//999
}
console.log(number) ;//1000

函数提升

函数声明也会被提升至他们作用域的顶部

临时死区

在ES6中没有必要使用typeof来检查变量是否被定义

严格模式

代码第一行插入字符串"use strict"

数组

操作数组

const arr = [
            1, 
            'a', 
            true, 
            {name: 'Tom'}, 
            null, 
            23, 
            'b', 
            {color: 'red'}, 
            false
        ] ;
        
const a = arr.find(
  (el, i) => i > 2 && typeof el === 'object'
) ;

console.log(arr) ;//[1, "a", true, {…}, null, 23, "b", {…}, false]
console.log(a) ;//{name: "Tom"}

数组方法,已删除或者未定义的数组

当数组中的元素未被赋值或已被删除,map,filter,reduce就不会调用所传入的函数。

一般情况不会对数组使用delete,会造成数组缺口

字符串连接

Array.prototype.join()方法接受一个分隔符作为参数,返回一个连接了所有元素的字符串

const arr = [1, 'a', true, undefined, null, NaN, {}, '', [] ] ;
const a = arr.join('?') ;
console.log(a) ;//1?a?true???NaN?[object Object]??
上一篇下一篇

猜你喜欢

热点阅读