JavaScript的常见问题

1、请指出一下HTML中a的字体颜色

 a{color: #ccc;}
 #contact a{color: #336699;}
 .link a{color: #f60}
 h1 a{color: #eee}

 <div id="contact">
 <h1 class="link"><a href="http://www.360.cn">hello</a></h1>
</div>

考察css标签的优先级。 答案:color: #336699.


2、alert(1&&2) //2

注解:
1、只要“||”前面为false,无论“||”后面是true还是false,结果都返回“||”后面的值。
2、只要“||”前面为true,无论“||”后面是true还是false,结果都返回“||”前面的值。
3、只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;
4、只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;

逻辑运算符,“||”和“&&”都是遵行短路原则,只要确定符号前面的真假,既可确定返回值. 但是“&&”的优先级是高于“||”。


3、考察this指向:alert出来的值是多少(请说明原因)

window.val = 1;
var json = {
    val:10,
    dbl: function () {
    this.val*=2;
    }
};
json.dbl();   //db1作为方法调用,此时this为json json.val=20 (10*2)
var dbl = json.dbl;   //db1函数赋值给db1变量后,此时的db1是一个普通的函数
dbl();  //普通函数调用,this指向windowwindow.val为 2 (1*2)
json.dbl.call(window); 
  //call方法调用,指定thiswindowwindow.val为4 (2*2) 
alert(window.val+json.val)   //所以结果为 24

4、alert出来的值是多少(请说明原因)

 function C1(name){
     if(name) this.name = name;
}

 function C2(name){
     this.name = name;
}

 function C3(name){
     this.name = name || 'john';
}

 C1.prototype.name = 'Tom';
 C2.prototype.name = 'Tom';
 C3.prototype.name = 'Tom';

 alert((new C1().name)+(new C2().name)+(new C3().name));
不运行,求答案!^_^,这道题目对于理解js作用域链十分有用,拿出来和大家分享.
要做出这道题,最重要是理解js中作用域链的概念,
从内到外大致如下:
内部 ---> prototype ---> window
变量查找顺序:
能在内部属性中找到的绝不去prototype中找,能在prototype中找到的绝不去window中找

1).先来分析第一个

new C1().name

function C1(name){
    if(name){
        this.name = name;
    }
}

C1.prototype.name = "Tom";
分析:
由于这里没有参数,默认被赋值成了undefined,所以到了if这里就进不去了,因此在C1内部
属性中找不到name这个属性,只能傻逼嘻嘻的往向找了,又因为C1.prototype.name = "Tom"的
存在,在prototype中找到了name属性,所以最后打印出来的答案是"Tom"


2).接着来分析第二个

new C2().name

function C2(name){
    this.name = name;
}

C2.prototype.name = "Tom";
分析:
由于这次还是没有参数,同样默认被赋值成了undefined,于是内部属性name被赋值成了
undefined。于是在查找的时候一下子就查到了name的值为undefined,
因此C2.prototype.name = "Tom"并没有什么卵用,最终答案为undefined


3).最后来分析第三个

new C3().name

function C3(name){
    this.name = name || "John";
}

C3.prototype.name = "Tom";
分析:
同样是没有参数,undefined作为参数进来以后情况变成了这样:
this.name = undefined || "john",然后结果很明显了内部属性name被赋值成"John"。
接着是从内往外查找,一下子就锁定了内部属性name,此时的值为"john"。
因此C3.prototype.name = "Tom"同样并没有什么用

故答案:Tomundefinedjohn

5、闭包问题:alert出来的值是多少(请说明原因)

var test = (function (i) {
 return function(){
    alert(i*2);
 };
}(2));
//test通过一个立即执行函数返回了一个匿名闭包函数,这个匿名闭包函数绑定了执行是传入的参数2
//且匿名闭包函数没有对传入自身的参数有特殊处理(利用arguments属性)
//所以test(5)和test()等价
test(5);

外面的function后面有个(2),那是立即执行了外面的函数并将参数i=2代入。也就是说test=function(){alert(2*2)}压根就没有参数

题目1 变量提升

if (!(“a” in window)) {
var a = 1;
}
alert(a);

解析:
变量提升,但变量赋值没有,等价于
var a; //声明
if (!(“a” in window)) {
a = 1; //初始化赋值
}


题目2 立即调用的函数表达式(自执行匿名函数)

var hi = function(){ alert(“hi”) };
hi();

等价于
(function(){ alert(“hi”) })();

● 常见格式:(function() { /* code */ })();
● 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号内为匿名函数的参数。
● 作用:可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你允许(变量前加上window,这样该函数或变量就成为全局)。各JavaScript库的代码也基本是这种组织形式。
总结一下,作用: 使这段代码被载入时候自动执行。 2. 避免污染全局变量。
其他写法
(function () { /* code */ })();
(function () { /* code */ } ());
!function () { /* code */ } ();
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值