为了账号安全,请及时绑定邮箱和手机立即绑定

javascript各种问题!

javascript各种问题!

小怪兽爱吃肉 2018-12-06 13:48:23
(1) function a(){ console.log(this);//window } a(); 此this指向的是window,那么可以理解为实际上是window.a()来调用吗?? b=10; function a(){   console.log(this);//window } a(); delete b; //truedelete a; //false delete 只有删除失败才会为空或者删除的对象时var申明的!如果是var声明的和上一个this指向window自相矛盾了呀??? (2) var fadeIn=function(){ fadeOut(); } var fadeOut=function(){ alert("fadeOut"); } fadeIn(); 还有这个fadeOu这个方法是在fadeIn下面申明的。为什么没有语法错误!之前看过博友的一篇文章说说有的对函数的引用都会添加到活动对象上面??不知可否是这样!是在太模糊了!javascript真难搞懂呀??我会在线等答案的.也希望各位博友能推荐一下关于这方面的javascript文章!谢谢....
查看完整描述

5 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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(); 如果要执行这句的话才会报错
查看完整回答
反对 回复 2018-12-24
?
墨色风雨

TA贡献1853条经验 获得超6个赞

(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。

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

 

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

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

查看完整回答
反对 回复 2018-12-24
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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

查看完整回答
反对 回复 2018-12-24
  • 5 回答
  • 0 关注
  • 566 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信