首页 新闻 会员 周边

javascript各种问题!

0
悬赏园豆:5 [已解决问题] 解决于 2012-07-11 06:31

(1)

function a(){
console.log(this);//window
 } 
a();

此this指向的是window,那么可以理解为实际上是window.a()来调用吗??

b=10;
function a(){
  console.log(this);//window    
}
a();
delete b; //true
delete a; //false

delete 只有删除失败才会为空或者删除的对象时var申明的!如果是var声明的和上一个this指向window自相矛盾了呀???

(2)

var fadeIn=function(){
    fadeOut();
}    
var fadeOut=function(){
    alert("fadeOut");    
}
fadeIn();

还有这个fadeOu这个方法是在fadeIn下面申明的。为什么没有语法错误!之前看过博友的一篇文章说说有的对函数的引用都会添加到活动对象上面??不知可否是这样!是在太模糊了!javascript真难搞懂呀??我会在线等答案的.也希望各位博友能推荐一下关于这方面的javascript文章!谢谢....

unbreakable的主页 unbreakable | 初学一级 | 园豆:111
提问于:2012-07-03 14:53
< >
分享
最佳答案
1

1.一个方法里的this指向的是调用这个方法的那个对象,如果没有被某个对象调用,则这个函数里的this指向undefined.但js引擎会私自做些处理,当this指向undefined 或者 null的时候,this会指向全局对象,浏览器里也就是window对象,比如a.call(undefined)也一样.但在ES5的严格模式中,情况变了,js引擎不会做处理,所以这里this的值就为undefined.

(function () {
"use strict";
a();

function a() {
console.log(
this); //undefined }
})()

2.没太看懂你问的.不过二楼的回答也是不对的.

var a = 1 和 a = 1 这两句定义的a都会成为全局对象的属性,只不过用var声明的属性是不可配置的,也就不能用delete删除,而不用var的话(一般称为隐式声明),这个属性就是可配置的,也就可以用delete删除.函数的话,不管函数声明还是函数表达式,都属于window对象上一个不可配置的属性.

如果用ES5的语句来讲

var a = 1

function a(){}

var a = function(){}

都相当于

Object.defineProperty(window, "a", {value:"值",configurable : false})
delete a //false

a = 1

a = function(){}

相当于

Object.defineProperty(window, "a", {value:"值",configurable : true})
delete a //true

 3.二楼回答的大概算对,不过还是有点问题

 在定义fadeIn的函数体时,fadeOut这个变量是能取到的,undefined而已,并不会报Reference Error。

"定义"二字应该为"初始化",在初始化的时候,fadeOut这个变量能不能取到,是不是undefined和报不报错一点关系都没有

只有在真正执行这个函数的时候,才会去检查变量是否有值,是不是函数.

活动对象的话...

var fadeIn, fadeOut;

fadeIn
=function(){
xxx();
//不会报错 };

fadeOut
=function(){
alert(
"fadeOut");
};

// fadeIn(); 如果要执行这句的话才会报错
收获园豆:5
紫云飞 | 菜鸟二级 |园豆:207 | 2012-07-04 21:12

“一个方法里的this指向的是调用这个方法的那个对象,如果没有被某个对象调用,则这个函数里的this指向undefined.但js引擎会私自做些处理,当this指向undefined 或者 null的时候,this会指向全局对象”我觉得你说的这句话很经典呀!呵呵你从那里看见的??推荐推荐

unbreakable | 园豆:111 (初学一级) | 2012-07-08 11:02
其他回答(2)
0

(1)实际不是window.a(),this在这种情况下指向global object(浏览器环境就是window对象)

 

(2)var a = 1和a = 1是有本质区别的,前者申明了一个变量a,后者只是在当前global object上添加了一个属性叫a。另外,很重要的一点,delete只能删除属性,不能删除变量或者函数等。

 

(3)这牵扯到一个hoist的概念,变量申明、函数申明会被提升到当前作用域的最顶端,你的代码实际上是下面这样的:

var fadeIn, fadeOut;

fadeIn=function(){
    fadeOut();
};    

fadeOut=function(){
    alert("fadeOut");    
};

fadeIn();

所以,在定义fadeIn的函数体时,fadeOut这个变量是能取到的,undefined而已,并不会报Reference Error。

*函数表达式中函数体并不会被提升,这是和函数申明有区别的。

 

为什么没有语法错误!之前看过博友的一篇文章说说有的对函数的引用都会添加到活动对象上面??

你的这句话木有看懂,什么意思?

BetaRabbit | 园豆:267 (菜鸟二级) | 2012-07-03 17:38
支持(0) 反对(0) unbreakable | 园豆:111 (初学一级) | 2012-07-08 11:04
0

1.没有指定民名空间是 var 声明的对象是绑定到全局变量上的 也就是window

2.

delete a; //这里是 true 
lz可以试验下

3.js是没有编译的
你声明的2个变量 (js是函数式编程 函数也可以是变量)被绑定到window对象上 调用时当然没有错了


学习多买点大师的书看看好了
http://limu.iteye.com/blog/1267475
codeyuyu | 园豆:224 (菜鸟二级) | 2012-07-06 14:56

我擦!好牛呀!这么多书!

支持(0) 反对(0) unbreakable | 园豆:111 (初学一级) | 2012-07-08 11:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册