加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 交互 > 正文

【转】外国朋友出的js题目,你能对几道

发布时间:2020-12-25 20:47:02 所属栏目:交互 来源:网络整理
导读:副标题#e# 原文地址?http://perfectionkills.com/javascript-quiz/ 中文地址加解释:by Aaron:http://www.cnblogs.com/aaronjs/p/3172112.html 附带了自己的理解,答案有争议的地方欢迎大家指出 题目一 ?"object" arguments是对象,伪数组有两件事要注意这里
副标题[/!--empirenews.page--]

原文地址?http://perfectionkills.com/javascript-quiz/

中文地址加解释:by Aaron:http://www.cnblogs.com/aaronjs/p/3172112.html

附带了自己的理解,答案有争议的地方欢迎大家指出

题目一

【转】外国朋友出的js题目,你能对几道

?"object"
arguments是对象,伪数组有两件事要注意这里:
参数不是数组,它是一个数组一样的物体,你可以使用方括号和整数索引的元素,但方法通常可在一个如推上不存在参数数组
Array.prototype.slice.call(arguments); 转成数组
当然arguments即使是数组,返回的依然是"object",因为数组也是对象,附加:typeof?对类型的判断
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

题目二

【转】外国朋友出的js题目,你能对几道

会发生错误
因为function g(){?return?23; }是函数表达式,事实上只有事一个名字,不是一个函数声明
函数实际上是绑定到变量f,不是g.
指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee
附非常详细的帖子函数表达式
http://kangax.github.io/nfe/

题目三

【转】外国朋友出的js题目,你能对几道

?1
参数不可删除
见我发过的帖子(js中的delete定义)
http://www.cnblogs.com/aaronjs/articles/3148934.html
国外的帖子(理解删除)
http://perfectionkills.com/understanding-delete/

题目四

【转】外国朋友出的js题目,你能对几道

??"undefined"
通过重写代码如下结果:
var?a,b; 展开就是?var?a;?var?b;.
A = B = C;相当于 B = C = B;

知道了这一点,我们重写并得到:
var?y = 1;?
y =?typeof?x;?
var?x = y;?
x;?

当执行
y =?typeof?x时,x 还没有被定义,所以y成为字符串"undefined",然后被分配到x

题目五

【转】外国朋友出的js题目,你能对几道

??"number"
为了便于理解我们继续分解:

第一部分
var?baz =?function(){?return?1; };?

第二部分
(function?f(f){?
??return?typeof?f();?
})(baz);?

在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型
无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是returntypeof?1

题目六

复制代码

var foo = {  
  bar: function() { return this.baz; },baz: 1 
}; 

(function(){  
  return typeof arguments[0](); 
})(foo.bar);

复制代码

【转】外国朋友出的js题目,你能对几道

 "undefined"
为什么是"undefined"?.
我们必须要知道this运算符是怎么工作的.

JS语言精粹总结的很精炼:
1 纯粹的函数调用
2 作为对象方法的调用
3 作为构造函数调用
4 apply调用

我们看看题目是属于那种环境?
在arguments[0]()中执行了一个方法,arguments[0]就是foo.bar方法
注意:这在foo.bar中的this是没有绑定到foo

虽然 foo.bar 传递给了函数,但是真正执行的时候,函数 bar 的上下文环境是 arguments ,并不是 foo
arguemnts[0] 可以理解为 arguments.0(不过写代码就不要这样了,语法会错误的),所以这样看来,上下文环境是 arguemnts 就没问题了,所以在执行baz的时候自然this就是window了,window 上没有baz属性,返回的就是undefined,typeof调用的话就转换成"undefined"了

附上博文
http://www.cnblogs.com/aaronjs/archive/2011/09/02/2164009.html

MDC
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Special_Operators/this_Operator#Description

题目七

var foo = { 
  bar: function(){ return this.baz; },baz: 1 
} 
typeof (f = foo.bar)();

【转】外国朋友出的js题目,你能对几道

  "undefined"
继续改写一下:
var foo = { 
  bar: function(){ return this.baz; },baz: 1 
} 

f = foo.bar; 

typeof f();

把foo.bar存储给f然后调用,所以this在foo.bar引用的是全局对象,所以就没有baz属性了
换句话说
foo.bar执行的时候上下文是 foo,但是当 把 foo.bar 赋值给 f 的时候,f 的上下文环境是 window ,是没有 baz 的,所以是 ”undefined"


                        

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读