作用域与闭包

来源:互联网 发布:莉娜因巴斯 知乎 编辑:程序博客网 时间:2024/04/28 06:33

作用域与闭包

变量的作用域

变量的作用域指的是:变量起作用的范围。

javascript 的变量依据作用域的范围分为:

1.全局变量

2.局部变量

全局变量

定义在函数外的变量都是全局变量

<script>  alert(a);  var a = 10;<script>

局部变量

在函数内声明的变量是局部变量,所以形参的变量也是局部变量

在函数的外部不能访问局部变量

<script>  function f(){  alert(v);//没有声明,所以结果为underfind  var v = "abc";//声明变量  alert(v);//弹出"abc"}  alert(v)//报错,在函数外部不能访问局部变量<script>

关于执行环境

在全局变量的执行环境中,有一个变量对象,这个变量对象把这个执行环境中定义的变量存储为这个变量对象的一个属性,访问变量,就相当于访问变量对象的一个属性。

在全局的执行环境中,变量对象就是window。

任何的函数都有一个属性:[[scope]]

<script>  function foo(){     var a = 20;    console.log(a);}var s = "hello World"console.log(s.replace(/[ ](\w)/gi, " $1".toUpperCase()));<script>

作用域链

作用域链与一个执行环境有关,作用域用于在变量查找

!C:\Users\Administrator\Desktop\JS-面向对象\Day5 作用域和闭包\Advanced_Day05

闭包

闭包可以分为广义上的闭包,也可以是狭义上的闭包。

广义上的闭包:

​ 只要一个函数,访问过这个函数外的变量,那这个函数就是闭包。

狭义上的闭包:

​ 如果一个函数,访问过它的外部函数的局部变量,那这个函数就是闭包

闭包的特点

​ 闭包能够访问外部函数作用域内的所有变量,而且访问的变量是最新的变量,即使外部的函数执行结束了,它依然能够访问外部的局部变量。

<script>  var a = 10;  function foo(){    var  = 20;        function f()            return b;        }    b = 30;    return f();}var b = foo()();console.log(b);<script>

使用闭包封装对象

<script>  function foo(){    name:"李四";    age:20;}return {    getName:function(){        return p.name;    },    getAge:function(){        return 20;    },    setName:function(name){        p.name = name;     },    setArrt:function(key,value){        p[key] = value;    },    getArrt:function(key){        return p[key];    }} var p = foo(); p.setName("滴滴答"); console.log(p.getName()); p.setArrt("sex","男"); console.log(p.getArrt("sex"));<script>

闭包 常见的for循环问题

常见的循环赋值问题

<button>按钮1<button><button>按钮1<button><button>按钮1<button>  <script>  var btn = document.querySelectorAll('button');  for(let i=0;i<btn.length;i++){      btn[i].onclick = function(){          console.log(i);      }    }  <script>

常见的高阶函数

高阶函数, 是函数式编程语言的一个非常重要的特点。

如果一个高阶函数接受一个或多个函数作为参数, 或者可以返回一个函数, 则这样的函数就叫高阶函数。

map:

<script>  var arr = [1,2,3,4,5];  var a1 = arr.map(function(x){      return x*x;  })  console.log(arr.map(Matn.sqrt));  console.log(a1)<script>

reduce:

10!的阶乘

<script>  var arr = [1,2,3,4,5];  var a1 = arr.reduce(function(a,ele){      return a *ele;  },1)  console.log(a1);<script>

filter: 过滤

<script>  var arr = [1,2,3,4,5,6,7,8,9,10];  var a1 = arr.filter(function(ele,index,arry){      return ele%2==1;  })  console.log(a1);<script>  
原创粉丝点击