• 有关this的两道问题


    1.var length=10;
    function fn(){
    console.log(this.length);
    }
    var obj = {
    length:5,
    method: function (fn) {
    fn();
    arguments[0]();
    }
    };
    obj.method(fn);
    obj.method(fn, 123);

    打印的结果是10 1 10 1
    分析:这里的obj.method(fn);,将一个函数传入进来, 执行fn()的时候对象变成了全局变量,所以 console.log(this.length)的时候就打印出了全局变量10。 arguments 的对象是arguments对象,arguments[0]指的是mathod函数的第一个对象,即fn,然后执行fn(),所以 console.log(this.length)时
    ,this就是method的函数的参数的个数

    2.function Foo() {
    getName = function () {
    console.log('1');
    };
    return this;
    }
    Foo.getName = function () {
    console.log('2');
    };
    Foo.prototype.getName = function () {
    console.log('3');
    };
    var getName = function () {
    console.log('4');
    };
    function getName() {
    console.log(5);
    }

    Foo.getName();
    getName();
    Foo().getName();
    getName();
    new Foo.getName();
    new Foo().getName();
    new new Foo().getName();

    这个题的结果是:2 4 1 1 2 3 3

    (1)Foo.getName直接有,不会再去进行加载,所以打印出来的是2;

    (2)getName有两个,零级作用域上有两个函数,一个是Foo,一个是getName,由于现在一个是函数表达式,一个是函数声明,函数声明将会提升,然后函数表达式会将其覆盖,所以window上的getNameN函数,最终为var getName = function () {
    console.log('4');
    };所以打印出4

    (3)先执行Foo,将里面隐式的全局函数getName释放,然后返回window对象,所以打印出1,同时将原来零级作用域上的getName函数覆盖。

    (4)打印getName函数,此时的window对象上的getName函数已经覆盖为 getName = function () {
    console.log('1');
    };,所以打印出1;

    (5)new( Foo.getName()) Foo不是函数,所以先执行Foo.getName(),打印出2;

    (6)(new Foo()).getName(); Foo是函数,所以先执行new Foo(),找到原型对象,然后再执行getName(),即执行的是Foo.prototype.getName = function () {
    console.log('3');
    };,所以打印出来为3;

    (7)new((new Foo()).getName())和上一题(6)类似,这里打印出3,然后new 3

  • 相关阅读:
    关于VS2010“ADO.NET Entity Data Model模板丢失或者添加失败问题
    Swagger的配置方法
    asp.net core的cookie认证
    abap程序开发
    闲置7成新二手图书处理(待更新)
    Winform 调用C++ OCX 传入参数和传出参数问题
    Html上传图片问题
    服务器端输出到客户端
    IE8下居然页面突然看不了
    解决Arial字体“高低肩问题”
  • 原文地址:https://www.cnblogs.com/Catherine001/p/7284513.html
Copyright © 2020-2023  润新知