一道超级复杂的js题目
先看以下代码:
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();
怎么样?是不是有点糊涂了。
首先要明确下面一些基本知识:
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没有任何意义,同上一个
一道超级复杂的js题目的更多相关文章
- C语言超级经典400道题目
C语言超级经典400道题目 1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____构A.顺序结构,选择结构,循环结 B.递 ...
- 值得一做》一道类似于货车运输的题目(BZOJ3732)(easy+)
这是一道模板套模板的题目,只要会LCA和最小生成树就可以做,水题 直接先甩题目 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条 ...
- 一道原生js题目引发的思考(鼠标停留区块计时)
我瞎逛个啥论坛,发现了一个题目,于是本着练手的心态就开始写起来了,于是各种问题接踵而至,收获不小. 题目是这样的: Demo: mouseenter与mouseover区别demo 跨浏览器的区块计数 ...
- 阿里巴巴Web前端面试的一道JS题目,求解答!!!
题目大概是这种: function outer(){ return inner; var inner = "a"; function inner(){}; inner = 9; } ...
- 记录一道有意思的js题目
偶然机会,在codewars上面开始做题,遇到一道有意思的题目,记录一下: 题目是这样的: In this kata, you will write a function that returns t ...
- 一道C语言安全编码题目
1.前言 最近在网上看到一道C语言题目,用C语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数,例如输入123,则输出字符串"321",,输入-123,则输出字符串&q ...
- 【转】外国朋友出的js题目,你能对几道
原文地址 http://perfectionkills.com/javascript-quiz/ 中文地址加解释:by Aaron:http://www.cnblogs.com/aaronjs/p/3 ...
- 刷题向》关于一道尺取法的神题目(BZOJ4653)(HARD-)(BZOJ 30题纪念)
不得不说,这也许会是一道长期在我的博客里作为“HARD”难度存在的题 这道题能很好的考验选手的思考能力,但本蒟蒻最后还是听了省队爷讲了之后才会...(默默面壁) 题目里,说对于每一个点,是用当前选出的 ...
- 那些年坑爹的JS题目
真是让人疑惑的基础.又是一堆奇怪的题目. 题目一. 应该是关于作用域的 function test(n) { this.x = n; return this; } var x = test(1); v ...
随机推荐
- jquery中跳出each循环
or循环 VS jquery.each continue return true break return false
- 利用HashMap存取对象并获得键值集合
1.HashMap 已实现的接口 Serializable, Cloneable, Map<K,V> 2.方法摘要 相关代码 /** * * @param ha * write(HashM ...
- c的free注意事项和c++的简洁(析构大哥)
#include <iostream> using namespace std; // ////c语言版本 //struct stu //{ // char *name; // int a ...
- Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline(转载)
转自:http://www.cnblogs.com/JohnTsai/p/4074643.html 相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned ...
- 【算法小总结】LCS问题&&HDU1243
LCS问题,又称最长公共子序列问题,是DP中较简单的一种,今天我们就来简单讲解一下. 设s1:AEGLEGLLELGEL 设s2:LREGELGEGLEG 求两个字符串的最大公共子序列长度 输出:8 ...
- linux 磁盘 分区、格式化、挂载
将容量结果易读的容量格式显示出来df -h 分区 初次接触仅分成两个分区(“/与Swap”)预留一个备用的剩余磁盘容量 磁盘分区 fdisk #df /找出磁盘文件名#fdisk /dev/hdc#m ...
- 目标Python2+3
很多时候你可能希望你开发的程序能够同时兼容Python2+和Python3+. 试想你有一个非常出名的Python模块被很多开发者使用着,但并不是所有人都只使用Python2或者Python3.这时候 ...
- _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 保存高斯消元模版. ps,这一题的英文名字是ヨスガノソラ的开发商~^_^ #inclu ...
- ACM_棋棋棋棋棋(规律题)
棋棋棋棋棋 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在遥远的K次元空间,一年一度的GDUFE-GAME又开始了.每年的GD ...
- 如何移除EditText自动焦点
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_cont ...