珠峰培训javascript技术与前端技术论坛

 找回密码
 立即注册
查看: 7171|回复: 5

预解释无节操一道关于预解释疑惑的问题,2014群里议论好久...

[复制链接]

6

主题

23

帖子

87

积分

版主

Rank: 7Rank: 7Rank: 7

积分
87
QQ
发表于 2014-3-12 13:59:48 | 显示全部楼层 |阅读模式
题目:
var foo=1;
function bar(){
     if(!foo){
           var foo=10;
     }
     alert(foo);
}
bar();

好多人不知道为什么是10?
成功不是一个人的华丽,而是因为我们在一起!
回复

使用道具 举报

5

主题

17

帖子

98

积分

版主

Rank: 7Rank: 7Rank: 7

积分
98
QQ
发表于 2014-3-13 13:40:57 | 显示全部楼层
预解释这个知识点估计是JS面试常见的问题了。
但是我不建议初学者去盯着这个东西死钻,学习是需要一个循序渐进的过程的。

首先,如果某个工程师能够写出主楼贴出来的这样的代码,那么说明他连最基本的东西都没有搞明白:到底这个变量是要用来干嘛?到底这个变量在什么时候要用到?
只有头脑不清晰的人才会写出上面这样的代码。

所以说,先放开这些相对较深的问题,先学习如何正确的编写代码。

建议初学者都好好琢磨琢磨这句话。
愚蠢的地球人
回复 支持 1 反对 0

使用道具 举报

6

主题

23

帖子

87

积分

版主

Rank: 7Rank: 7Rank: 7

积分
87
QQ
 楼主| 发表于 2014-3-12 14:03:24 | 显示全部楼层
预解释是毫无机制的,刚开始不论你写在哪里都会预解释
所以:预解释的时候 创建了两个变量:一个是全局的foo 一个是bar私有的foo   创建了一个函数bar
接下来代码执行,首先将全局的foo赋值为1
然后执行了bar方法
在bar方法中  已经定义了foo这样的变量  所以里面的!foo或者是alert(foo)  都是bar私有的
刚开始执行的时候!foo是true,所以给bar的私有变量foo赋值10
所以弹出来的是10
成功不是一个人的华丽,而是因为我们在一起!
回复 支持 反对

使用道具 举报

1

主题

23

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2014-3-13 12:58:25 | 显示全部楼层
会不会解析成这个?

  1. var foo=1;
  2. function bar(){
  3.      var foo;//
  4.      if(!foo){
  5.            foo=10;
  6.      }
  7.      alert(foo);
  8. }
  9. bar();
复制代码
回复 支持 反对

使用道具 举报

0

主题

5

帖子

44

积分

新手上路

Rank: 1

积分
44
发表于 2014-3-13 13:26:58 | 显示全部楼层
本帖最后由 xiaoY 于 2014-3-13 13:29 编辑

试着描述下自己的理解:


js执行前 会对 var 和 funcation 进行预解

一个方法(通常是指{}包围的代码段)执行的时候

  内部变量 先重置为undefined
  创建 形参,实参,内部变量, 它们里面同名的是引用关系
   同名变量之间是 引用关系
  方法内的赋值语句:给内部变量赋值
  变量查找规则  在当前作用域(可以理解为{} 内)内先查找,找不到 在往上找。
  方法执行完毕以后:内部变量不会被重置
   方法内变量的生存周期取决于方法实例是否存在活动引用
    if(!foo){
        var foo=10;
    }
    本来 foo在{}里面才是10,但是 if表达式  引用了该变量 所以 激活了foo的新作用范围(bar方法里),在bar({}一个新的作用域)方法里面也可以使用该引用。导致在这里是10;


我们换个方式 对比下代码
  1. var foo=1;
  2.     function aa(){
  3.         function bb (){
  4.            var foo=10;
  5.         }
  6.         if(!foo) bb();
  7.         alert(foo)
  8.     }
  9.     aa();//1
复制代码


回复 支持 反对

使用道具 举报

21

主题

78

帖子

289

积分

版主

Rank: 7Rank: 7Rank: 7

积分
289
发表于 2014-3-14 18:58:55 | 显示全部楼层
var foo=1;
function bar(){
     if(!foo){
           var foo=10;
     }
     alert(foo);
}
bar();
//声明和定义foo = 1,声明有一个函数bar(){...}=>执行bar()=>声明foo=》(!foo)为true=>foo=10=>alert(foo)
这题主要考察的是其实作用域就分两种,函数内部的,还有全局的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|珠峰培训--JavaScript培训

GMT+8, 2021-6-21 12:40 , Processed in 0.287134 second(s), 22 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表