美文网首页
一个比较复杂的js题目

一个比较复杂的js题目

作者: tsunamiGG | 来源:发表于2018-10-12 16:07 被阅读0次


function Foo(){

getName = function(){ alert(1); };

return this;

}

Foo.getName = function(){ alert(2); };

Foo.prototype.getName = function(){ alert(3); };

var getName = function(){ alert(4); };

function getName(){ alert(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、 this的指向只取决于调用的方式,,函数定义里面的this指向全局的window;

new的过程:新建对象,让this指向它,返回this;

普通的函数调用时得到的值是return的返回值,new 得到值可能是this也有可能是return 的值,这取决于return后面数据的类型。

2、实例化对象访问一个属性的顺序,先看自身有没有这个属性,再看访问原型里的。

3、new 后面跟的是一个构造函数,则会创建一个对象。如果是一个构造函数的属性名称,那么没有任何作用。

new 只会和离他最近的()结合


//结果分析

一开始Foo.getName()为1,第5行代码将它修改为2,所以Foo.getName()的输出为2;

getName() 是全局调用,函数提升优先于变量提升,到了第7行代码getName()被修改为4,所以输出为4;

Foo()是函数调用,得到的是return后面的值this,this指向window,并且第2行代码将getName()修改为1,所以结果为1

同理,getName()的输出也是为1;

new Foo.getName() new没有任何作用,这里是方法调用,输出值为2

new Foo().getName() new和最近的一个()结合,所以得到了一个实例化对象,实例化对象自身没有getName这个属性,所以访问原型里面的getName,为 3

new new Foo().getName() 最前面的new没有任何意义,同上一个


结语:这个题目主要涉及this在各种调用中的表现,能够更加清晰的理解this

相关文章

  • 一个比较复杂的js题目

    function Foo(){ getName = function(){ alert(1); }; return...

  • 626. Exchange Seats

    题目链接: 626. Exchange Seats 解析: 本题是一个交换的问题,比较复杂,首先根据题目要求可以知...

  • JS题目

    JS 1、原型/原型链/构造函数/实例/继承 1. proto(原型) 每个对象又有proto属性,指向创建他的构...

  • 有趣的js题目

    中二分法 从已经排好顺序的数组中取出一个数的位置(也可能是插入一个数到排列好的数组中而不打乱顺序) 最大公约数 1...

  • js的部分题目

  • js经典题目

    1闭包 链接:学习Javascript闭包(Closure) setTimeout在js单线程中只是放在队列中并未...

  • js题目练习

    7.23 1,计算给定数组arr中所有元素的总和,数组中的元素均为Number 类型。例如:[1,2,3,4]--...

  • js数组题目

    1、寻找两个数组中相同的元素中最小的元素 2、判断一个字符串中出现次数最多的字符,统计这个次数var str=’a...

  • js数组题目

    js面试题 js数组 一、按要求分割数组 将"js,数组,分类"字符串数组以/分割 for循环累加 join()把...

  • npm-npmscript-gulp-webpack

    题目1: 如何全局安装一个 node 应用? npm install -g xxx 题目2: package.js...

网友评论

      本文标题:一个比较复杂的js题目

      本文链接:https://www.haomeiwen.com/subject/yojgaftx.html