zoukankan      html  css  js  c++  java
  • 闭包、this、ES6特性

    声明一个函数 function fun1

    函数内定义一个变量比如 var x=1

    如果这时候在function内声明一个函数 fun2

    fun2中对这个函数外面的x进行操作


    这时候把fun2的地址付给函数外面的一个变量A

    形成一个函数表达式,

    因为JS中的作用域是从内层向外层找变量的值


    每次运行A 即A()的时候都需要找之前那个x 这时候函数fun1就叫作一个闭包(closure) ,这个x会一直留在内存中不会被回收 即 —(closure:fun1)

    fun2       fun1       全局    --->  作用域链
    |        (包起来了)       |
    |                                 |
    ----------------------------
                  |
                  |
    形成了一个闭包


    因为全局和fun2的作用域连结起来了

    讲一下this:

    1.this是在一个函数被调用时确定的。(注意函数这两个大字)

    2.函数被调用的时候 如果函数被某一个对象所拥有, 那么this指向这个对象。

    3.如果函数独立调用,this指向undefined,在非严格模式下指向window

    4.当this为某个(属性:值)键值对中的值的内容时,先找那个函数,再找那个函数的对象,要是没有函数就是window

    关于第四点:
    var obj = { a:this };
    console.log(obj.a); <-没有函数,最后找到window

    // demo
    var a = 20;

    var obj = {
    a: 10,
    c: this.a + 20, <--这里的this是window

    fn: function () {

    return this.a; <--函数fn属于obj对象,这里的this是obj
    }
    }

    console.log(obj.c);
    console.log(obj.fn());

    // demo2
    'use strict';

    var a = 20;

    function foo () {
    var a = 1;
    var obj = {
    a: 10,
    c: this.a + 20, <--这里this,先看他在 函数 foo里面,然后foo并不属于任何对象 所以是undefined
    fn: function () {
    return this.a;
    }
    }
    return obj.c;
    }
    console.log(foo()); // ?
    console.log(window.foo()); // ? <-- window对象中的foo

    写一个粘合函数:

    function glue(){
    var a = Array.prototype.slice.call(arguments); //call中的this指向了arguments
    console.log(a.join(''));
    }
    glue('把',123,'我','粘合','起来吧');

    讲一下箭头函数:

    function a(){

    var x = 20;

    return function(){
    this.x;
    }
    }


    a();


    这样return的是10。(this是在函数被调用时确定的,return的这个function不属于任何对象,所以这个function中的this是undefined,在非严格下是window)


    如果是用 return ()=> this.x this是他外面的this


    原因:箭头函数中没有this,如果在箭头函数中使用this,则这个this一定是他外层的this 即爸爸function的this!!

  • 相关阅读:
    自定义TextInput中displayAsPassword的字符
    C#序列化与反序列化代码记录
    解决Discuz!NT"Code: 100, Message: 指定..."问题
    如何在asp.net项目开发的验证码图片和打印中区别0和O(零和字母O)
    "淘宝开放平台"可以成为程序员的摇钱树吗?
    Discuz!NT与asp.net整合集成实例教程
    最震撼的大片《2012》世界末日 电影 高画质 超DVD版清晰效果 在线视频播
    划时代的感人大片!《机器人总动员》(WALL.E) 在线播放
    从数据库某表转换并导入数据到另一表
    界面原型设计工具选择报告
  • 原文地址:https://www.cnblogs.com/eret9616/p/8796122.html
Copyright © 2011-2022 走看看