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 这种情况也叫“声明提前”。

时间: 2024-12-26 22:45:52

JavaScript权威设计--JavaScript类型,值,变量(简要学习笔记四)的相关文章

JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)

1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向表示文档元素的HTMLElement对象. Window对象是以全局对象的形式存在于作用域链的最上层,这就意味着HTML文档中使用的id属性会成为可以被脚本访问的全局变量. 如: <button id="but"/> 就可以通过全局变量but来引用此元素. 2.多窗体窗口(if

JavaScript权威指南(第6版)学习笔记四

第七章 数组 一.创建数组 使用数组直接量是最简单的方法: var empty=[]; var primes=[1,3,5,7,11]; var m=[1.1,"a",true]; var b=1024; var table=[b,b+1,b+2]; var bc=[[1,{x:1,y:2}],[2,{x:3}]] //如果直接量中省略某个值,则默认赋予undefined值 var count=[1,,3]; 数组直接量中允许元素结尾有逗号: var a=[1,2,]; //两个元素分

JavaScript权威设计--JavaScript函数(简要学习笔记十)

1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"likeZqz()".有些些函数是用作内部用的或者为私有函数通常以一条下划线为前缀,就像"_zqzName()". 2.以表达式方式定义的函数 如: var zqz=function (){ return "zhaoqize"; } 在使用的时候必须把它赋值给一个变

JavaScript权威指南(第6版)学习笔记一

第2章  词法结构 一.字符集 *JavaScript程序是用Unicode字符集编写的. *JavaScript严格区分大小写. *JavaScript注释:(1)"//"用于单行注释:(2)"/*    ....     */"用于多行注释. *JavaScript使用分号将语句之间分隔:如果各条语句单独成一行,通常可以省略分号.但下面几种情况需要注意: a = 3; //这里的分号是可以省略的 b = 4; a = 3; b = 4; //这里第一个分号不能省

JavaScript权威设计--JavaScript函数(简要学习笔记十二)

1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. 如: function my(){ } my(); //别忘记调用 这段代码定义了一个单独的全局变量:名叫"my"的函数. 我们还可以这么写,定义一个匿名函数: (function(){ //这里第一个左括号是必须的,如果不写,JavaScript解析器会将 //function解析成函

JavaScript权威设计--JavaScript函数(简要学习笔记十一)

1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScript构造函数调用的语法是允许省略实参列表和圆括号的. 如: var o=new Object(); //->等价于 var o=new Object; 第四种:使用call()与apply()间接调用(放在后面详细说明) 2.函数的实参与形参——可选形参 先看一个例子: function getA(

JavaScript权威设计--JavaScript表达式与运算符(简要学习笔记五)

1.3种原始表达式 1.直接量:    1.23    //数字直接量 “hello”    //字符串直接量 ... 2.保留字构成的原始表达式: true    //返回布尔值:真 false    //假 null    //返回一个值:空 3.变量: i    //返回变量i的值 sum    //返回sum的值 2.对象初始化表达式 var p={ x:2.3, y:-1.2 } //一个拥有两个属性成员的对象 对象直接量也可以嵌套: var rea={ upp:{ x:2, y:2

JavaScript权威设计--JavaScript对象(简要学习笔记七)

1.with语句 语法: width(object){ statement } with语句可用于临时扩展作用域链.作用域链可以按序检索的对象列表,通过它可以进行变量名解析. with将object添加到作用域链的头部,然后执行内部statement,最后把作用域链回复到原始状态. 但是:with语句要尽量避免使用.有with代码的语句难以优化,且运行的更慢. 在对象嵌套跟多层次的时候通常会使用with来优化. 如: document.forms[0].address.value //-> wi

JavaScript权威设计--JavaScript数组(简要学习笔记九)

1.数组的创建 如: var a=[1.1,null,"a"]; var b=[1, ,3]; //中间的那个元素是undefined var c=[ , , ] 这里c.length你是不是以为是3? 哈哈,长度应该是2.因为数组直接量的语法允许有可选的结尾逗号. 2.数组索引的其他种类 a[-1.23]=true    //创建一个名为-1.23的属性 a["1000"]=0    //如果是字符串,它就转换为数组的索引 a[1.000]    //和a[1]相