JavaScript权威设计--JavaScript变量,作用域,声明提前(简要学习笔记四)

简介:
1.宿主对象与宿主环境
宿主对象:由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。
 
宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序。如:web浏览器等。
 
2.日期的转换
var  now =new Date();
typeof(now+1)    //string
typeof(now-1)    //number
now==now.toString();    //true
now>(now-1)    //true    '>'将日期转换为数字
 
3.变量的声明
var i;
var sum;
或者
var i,sum;
这些没有赋初始值的对象,初始值就是undefined
 
4.在函数体内,局部变量的优先级高于同名的全局变量。并且同名局部变量会修改(覆盖)全局同名变量的值。
var a="glo";
function check(){
    var a="ble";
    return a;
}
check();    //ble

 

5.函数作用域与声明提前
分析一个例子,如下:
var scp="glob";
function f(){                
    console.log(scp);    //输出"undefined",而不是"glob"
    var scp="loca";        //在这里初始化
    console.log(scp);    //输出"loca"
}
理解:可能你觉得为什么第一个输出是"undefined",你可能觉得应该输出"glob"。因为scp上面定义的是全局变量啊。
全局变量在js中的任何地方都是起作用的,为什么这里出问题了呢?
首先,正如第四点所说。全局变量scp与局部变量scp同名,所以局部变量scp覆盖全局变量scp.
然后,你又困惑,代码当时不是只是执行到第一个输出语句么,还没执行到下面的var scp="loca"么?这时我们要明白一点。
js的函数作用域是指在函数内声明的所有变量在函数体内部是可见的!
正如这个例子,函数内部定义的scp无论是在var scp="loca"上面还是在下面。是都存在的!
如果你不信,你可以这么测试一下:
<script >
a();
function d(){
    console.log(b);
}
</script>
 
 
 
 
如果b没有的话,显示的没有被定义而不是输出"undefined"
我们上面说过函数声明后没有赋初始值,默认其初始值就是"undefined"。
可见f()函数内部 scp 是存在的。只是没有初始化。直到后面初始化"loca"。
其实上面的例子真是的情况应该是这样:
复制代码
var scp="glob";
function f(){ 
     var scp ;             
    console.log(scp);    //输出"undefined",而不是"glob"
    var scp="loca";        //在这里初始化
    console.log(scp);    //输出"loca"
}
复制代码
scp 这种情况也叫“声明提前”。
 
下面这种情况有点意思!
复制代码
var a=1;
function b(){
  a=2;
  return;
  function a(){}      
}
//调用
b();
console.log(a)    //a=1
复制代码

 

转载:http://www.cnblogs.com/zqzjs/p/4796242.html

目录
相关文章
|
21天前
|
存储 JavaScript 前端开发
解释 JavaScript 中的作用域和作用域链的概念。
【4月更文挑战第4天】JavaScript作用域定义了变量和函数的可见范围,静态决定于编码时。每个函数作为对象拥有`scope`属性,关联运行期上下文集合。执行上下文在函数执行时创建,定义执行环境,每次调用函数都会生成独特上下文。作用域链是按层级组织的作用域集合,自内向外查找变量。变量查找遵循从当前执行上下文到全局上下文的顺序,若找不到则抛出异常。
21 6
|
21天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JS的执行上下文、词法作用域和闭包(中)
深入理解JS的执行上下文、词法作用域和闭包(中)
|
1月前
|
存储 自然语言处理 JavaScript
深入理解JS的执行上下文、词法作用域和闭包(上)
深入理解JS的执行上下文、词法作用域和闭包(上)
|
23天前
|
JavaScript 前端开发
JavaScript 中如何检测一个变量是一个 String 类型?
JavaScript 中如何检测一个变量是一个 String 类型?
21 2
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是作用域(scope),并说明全局作用域、局部作用域和块级作用域的区别。
JavaScript中的作用域规定了变量和函数的可见性与生命周期。全局作用域适用于整个脚本,变量可通过全局对象访问,可能导致命名冲突和内存占用。局部作用域限于函数内部,每次调用创建新作用域,执行完毕后销毁。ES6引入的块级作用域通过`let`和`const`实现,变量仅在其代码块内有效,并有暂时性死区。作用域机制有助于代码组织和变量管理。
23 1
|
1月前
|
JavaScript 前端开发
JS作用域与作用域链
JS作用域与作用域链
|
1月前
|
自然语言处理 JavaScript 前端开发
深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(下)
深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(下)
|
1月前
|
JavaScript 前端开发
深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(上)
深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(上)
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JS的执行上下文、词法作用域和闭包(下)
深入理解JS的执行上下文、词法作用域和闭包(下)