你不知道的javascript笔记

柠檬先生 柠檬先生     2022-09-06     405

关键词:

规避冲突

function foo(){

function bar(a){

i = 3;

console.log(a + i);

}

for ( var i=0; i < 10; i++){

bar(i * 2)

}

}

  // 11无限死循环

 

区分函数声明和函数表达式最简单的方法是看 function 关键字出现的位置,如果function是声明中的第一个词,那么是函数声明,否则是函数表达式。

(function foo(){})() 立即执行的函数表达式

 

IIFE 立即执行函数表达式

var a = 2; 

(function IIFE(global){

var a = 3;

console.log(a); // 3

console.log(global.a) // 2

})(window)

console.log( a)  // 2

 

将window 对象的引用传递进去,当然可以从外部作用域传入进任何你需要的东西,

并可以将变量命名为任何你觉得合适名字。

var a = 2;

(function IIFE(def) {

    def(window)

})(function def(global) {

    var a = 3;

    console.log(a); // 3

    console.log(global.a) //2

});

         函数表达式def 定义在片段的第二部分,然后当做参数被传递进IIFE 函数定义的第一部分中。最后def也就是传递进去的函数被调用,并将window 传入当做global参数的值。

 

try/catch 的catch 分句会创建一个块级 作用域,其中声明的变量仅在catch内部有效

例如:try{

undefinde();

}catch (err){

console,log(err); // 能够正常使用

  }

  console.log(err)  // ReferenceError: err not found

let 块作用域

var foo = true;

if(foo){

let bar = foo *2;

bar  = something(bar);

console.log(bar);

}

console.log(bar); // ReferenceError

 

变量提升,先有声明后又赋值。

foo();

function foo(){

console.log(a); // undefinded

var a = 2;

}

 原因:相当于以下

  function foo(){

var  a;

console.log(a); // undefined

a = 2;

}

foo();

 

注意: 函数声明会被提升,函数表达式不会被声明。函数和变量都会被提升,但是函数会被提前提升,然后是变量。

foo();   //1

var foo;

function foo(){

console.log(1);

}

foo = function() {

console.log(2)

}

  const  常量

 

后面的函数声明会覆盖前面的

foo(); // 3

function foo(){

console.log(1);

}

var foo = function() {

console.log(2);

}

function foo(){

console.log(3);

}

var a = 2 ; 的解析原则是  var  a 和  a = 2  当做两个单独的声明,第一个是编译阶段的

任务,第二个是执行阶段的任务。

 

闭包

function foo() {

var a = 2;

function bar(){

console.log(a);

}

return bar;

}

var baz = foo();

baz(); // 2

var fn;

function foo() {

var a  = 2;

function baz() {

console.log(a)

}

bar(baz);

}

function bar(fn){

fn();

}

for(var i = 1; i<=5; i++){

(function(j){

setTimeout(function(){

console.log(j)

},j*1000)

})(i)

}

在迭代器内部使用IIFE会为每一个迭代都生成一个新的作用域。

 

块作用域和闭包联手

for(var i = 1; i <= 5; i++){

setTimeout(function timer(){

console.log(i)

},i*1000)

}

模块

function  CoolModule(){

var  something = "cool";

var another = [1,2,3];

function doSomething() {

console.log(something);

}

function doAnoth(){

console.log(another.join("!"));

}

return {

doSomething: doSomething,

doAnother: doAnother

};

}

var  foo = CoolModule();

foo.doSomething(); //cool

foo.doAnother() // 1!2!3

 

改为单例模式:

var foo = (function CoolModule(){

var something = "cool";

var another = [1,2,3];

function doSomething() {

console.log(something)

}

 

function doAnother(){

console.log(another.join("!"))

}

 

return {

doSomething: doSomething,

doAnother: doAnother

}

})();

foo.doSomething(); // cool

foo.doAnother(); //1!2!3

 

你不知道的javascript笔记

类型:JavaScript有7种内置类型空值(null)未定义(undefined)布尔值(boolean)数字(number)字符串(string)对象(object)符号(symbol)   除对象以外,其他统称为“基本类型” 用typeof运算符来查看值的类型typeofundefined ==="undefi... 查看详情

你不知道的javascript笔记

...算符则相当于标点符号和连接词。          JavaScript中表达式可以返回一个结果值。            vara=3*6;            varb=a;              b; &nbs 查看详情

你不知道的javascript中,读书笔记

七种内置类型null,undefined,boolean,number,string,object,symboltypeofnull===‘object‘//truenull是typeof是object的唯一的假值typeoffunction会返回‘function‘使用typeofx!==‘undefined‘比直接判断x更加安全,因为不会引发referenceerror 查看详情

你不知道的javascript笔记

this和对象原型this是一个很特别的关键字,被自动定义在所有函数的作用域中//foo.count是0,字面理解是错误的    functionfoo(num){        console.log("foo:"+num);    &n 查看详情

你不知道的javascript(上卷)读书笔记之一----作用域

你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些”坑”,在这里写一些博客记录一下笔记以便消化吸收。1编译原理在此书中,开始便提出:Javascript是一门编译型语言,我... 查看详情

你不知道的javascript笔记

规避冲突functionfoo(){functionbar(a){i=3;console.log(a+i);}for(vari=0;i<10;i++){bar(i*2)}} //11无限死循环 区分函数声明和函数表达式最简单的方法是看function关键字出现的位置,如果function是声明中的第一个词,那么是函数声明,否则是... 查看详情

你不知道的javascript--上卷--读书笔记1

作用域是什么?  答:在《你不知道的javascript》书中提到,作用域就是根据名称查找变量的一套规则。古语有“无规矩不成方圆”,但是没有方圆,规矩又给谁用?所以个人理解作用域就是“规矩”+”方圆“。作用域是在创... 查看详情

你不知道的javascript-上卷の读书笔记

...;        1— 作用域对JavaScript而言,大部分情况下编译发生 查看详情

你不知道的javascript--上卷--读书笔记2

...以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。闭包有哪些应用?  答:函数作为返回值:functionfoo(){vara=2;functionbar(){//bar拥有涵盖foo作用域的闭包,并对它保持 查看详情

javascript中的this—你不知道的javascript上卷读书笔记

this是什么?this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。当一个函数被调用时,会创建一个活动记录(有时... 查看详情

你不知道的javascript学习笔记1——作用域

处理程序三要素:引擎:编译与执行过程。编译器:语法分析与代码生成等。作用域:收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。&nb... 查看详情

你不知道的javascript(上卷)读书笔记之二----词法作用域

...要的工作类型,一种是词法作用域,一种是动态作用域,Javascript采用的是词法作用域,关于动态作用域的有兴趣的可以自行Google。1.词法阶段         首 查看详情

《你不知道的javascript上卷》学习笔记(代码片段)

第一部分:作用域和闭包一、作用域1.作用域:存储并查找变量的规则2.源代码在执行之前(编译)会经历三个步骤:分词/此法分析:将代码字符串分解成有意义的代码块(词法单元)解析/语法分析:将词法单元流转换成抽象语... 查看详情

你不知道的javascript上卷-读书笔记-第2章词法作用域-2.2欺骗词法(代码片段)

你不知道的JavaScript上卷-读书笔记-第2章词法作用域-2.2欺骗词法作用域`eval`和`with`的缺点作用域JavaScript在ES6以前只有函数作用域。ES6开始支持块作用域:通常就是包裹的范围作用域中查找变量or函数的规则是从当前向... 查看详情

你不知道的javascript上卷-读书笔记-第2章词法作用域-2.2欺骗词法(代码片段)

你不知道的JavaScript上卷-读书笔记-第2章词法作用域-2.2欺骗词法作用域`eval`和`with`的缺点作用域JavaScript在ES6以前只有函数作用域。ES6开始支持块作用域:通常就是包裹的范围作用域中查找变量or函数的规则是从当前向... 查看详情

读书笔记你不知道的javascript(上卷)--作用域是什么

...1、理解作用域几个名词的介绍引擎:从头到尾负责整个JavaScript程序的编译及执行过程编译器:负责语法分析及代码生成器等脏活累活作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严... 查看详情

读书笔记《你不知道的javascript(上卷)》——第二部分this和对象原型(代码片段)

文章目录第6章行为委托6.1面向委托的设计6.1.1类理论6.1.2委托理论1.互相委托(禁止)2.调试6.1.3比较思维模型6.2类与对象6.2.1控件“类”ES6的class语法糖6.2.2委托控件对象6.3更简洁的设计反类6.4更好的语法反词法6... 查看详情

js你不知道的javascript笔记-this-四种绑定规则-绑定优先级-绑定例外-箭头函数(代码片段)

文章目录1.为什么要用`this`2.关于`this`的误解2.1`this`不是指向函数自身2.2`this`不指向函数的词法作用域3.什么是调用栈与调用位置4.`this`的绑定规则4.1默认绑定`fun()`4.2隐式绑定`obj.fun()`隐... 查看详情