专栏首页柠檬先生你不知道的javaScript笔记(1)

你不知道的javaScript笔记(1)

规避冲突

 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
 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript 基础(五) 函数 变量和作用域

    函数定义和调用    定义函数,在JavaScript中,定义函数的方式如下:       function abs(x){         if...

    用户1197315
  • JavaScript 基础(六) 数组方法 闭包

    在一个对象中绑定函数,称为这个对象的方法。 在JavaScript 中,对象的定义是这样的;     var guagua = {         na...

    用户1197315
  • 你不知道的javaScript笔记(2)

    this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的     function f...

    用户1197315
  • JavaScript 提升不完全指北

    很多人会认为是 undefined , 因为 var a 声明在 a = 2 之后, 他们自然而然地认为变量被重新赋值了, 因此会被赋予默认值 undefin...

    撸码那些事
  • 从零开始学 Web 之 JavaScript(三)函数

    全局变量:在 script 使用 var 定义的变量(所有的 script 共享其全局性,js 里面没有块级作用域概念,只有全局作用域和局部作用域)。

    Daotin
  • JavaScript(五):函数(闭包,eval)

    1.函数的申明:三种方法: function命令 函数表达式:变量赋值 Function构造函数 1 //method 1: function命令 2 fu...

    用户1149564
  • 知识总结:四个例子理解闭包//例一//例二//例三//例四

    /** * 闭包原理 * @date   2017-04-10 14:04:17 * @version 1 */ //理解作用域、作用域链 //内部作用域可以通...

    牛客网
  • 函数与作用域

    小胖
  • JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象

    一、闭包(Closure) 1.1、闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,...

    张果
  • JavaScript学习笔记007-js的执行

    Mr. 柳上原

扫码关注云+社区

领取腾讯云代金券