信息发布软件,b2b软件,广告发布软件
标题: 变量JavaScript 最常用到的这些算术脑补一下数学知识吧 [打印本页]
作者: 群发软件 时间: 2017-5-28 23:22
标题: 变量JavaScript 最常用到的这些算术脑补一下数学知识吧
本帖最后由 群发软件 于 2017-5-28 23:29 编辑
javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。
先看一段代码
| var v = "hello";
(function(){
console.log(v);
var v = "world";
})();
|
这段代码运行的结果是什么呢?
答案是:undefined
这段代码说明了两个问题,
第一,function作用域里的变量v遮盖了上层作用域变量v。代码做少些变动
| var v = "hello";
if(true){
console.log(v);
var v = "world";
}
|
输出结果为”hello”,说明javascript是没有块级作用域的。函数是JavaScript中唯一拥有自身作用域的结构。
第二,在function作用域内,变量v的声明被提升了。所以最初的代码相当于:
| var v = "hello";
(function(){
var v; //declaration hoisting
console.log(v);
v = "world";
})();
|
声明、定义与初始化
声明宣称一个名字的存在,定义则为这个名字分配存储空间,而初始化则是为名字分配的存储空间赋初值。
用C++来表述这三个概念
| extern int i;//这是声明,表明名字i在某处已经存在了
int i;//这是声明并定义名字i,为i分配存储空间
i = 0;//这是初始化名字i,为其赋初值为0
|
javascript中则是这样
| var v;//声明变量v
v = "hello";//(定义并)初始化变量v
|
因为javascript为动态语言,其变量并没有固定的类型,其存储空间大小会随初始化与赋值而变化,所以其变量的“定义”就不像传统的静态语言一样了,其定义显得无关紧要。
声明提升
当前作用域内的声明都会提升到作用域的最前面,包括变量和函数的声明
| (function(){
var a = "1";
var f = function(){};
var b = "2";
var c = "3";
})();
|
变量a,f,b,c的声明会被提升到函数作用域的最前面,类似如下:
| (function(){
var a,f,b,c;
a = "1";
f = function(){};
b = "2";
c = "3";
})();
|
请注意函数表达式并没有被提升,这也是函数表达式与函数声明的区别。进一步看二者的区别:
| (function(){
//var f1,function f2(){}; //hoisting,被隐式提升的声明
f1(); //ReferenceError: f1 is not defined
f2();
var f1 = function(){};
function f2(){}
})();
|
上面代码中函数声明f2被提升,所以在前面调用f2是没问题的。虽然变量f1也被提升,但f1提升后的值为undefined,其真正的初始值是在执行到函数表达式处被赋予的。所以只有声明是被提升的。
名字解析顺序
javascript中一个名字(name)以四种方式进入作用域(scope),其优先级顺序如下:
1、语言内置:所有的作用域中都有 this 和 arguments 关键字
2、形式参数:函数的参数在函数作用域中都是有效的
3、函数声明:形如function foo() {}
4、变量声明:形如var bar;
名字声明的优先级如上所示,也就是说如果一个变量的名字与函数的名字相同,那么函数的名字会覆盖变量的名字,无论其在代码中的顺序如何。但名字的初始化却是按其在代码中书写的顺序进行的,不受以上优先级的影响。看代码:
| (function(){
var foo;
console.log(typeof foo); //function
function foo(){}
foo = "foo";
console.log(typeof foo); //string
})();
|
如果形式参数中有多个同名变量,那么最后一个同名参数会覆盖其他同名参数,即使最后一个同名参数并没有定义。
以上的名字解析优先级存在例外,比如可以覆盖语言内置的名字arguments。
命名函数表达式
可以像函数声明一样为函数表达式指定一个名字,但这并不会使函数表达式成为函数声明。命名函数表达式的名字不会进入名字空间,也不会被提升。
| f();//TypeError: f is not a function
foo();//ReferenceError: foo is not defined
var f = function foo(){console.log(typeof foo);};
f();//function
foo();//ReferenceError: foo is not defined
|
命名函数表达式的名字只在该函数的作用域内部有效。
===
在认识一切事物之后,人才能认识自己,因为事物仅仅是人的界限。
变量是用于存储信息的容器:
x=5; length=66.10;
还记得在学校里学过的代数吗?
当您回忆在学校学过的代数课程时,想到的很可能是:x=5, y=6, z=x+y 等等。
还记得吗,一个字母可以保存一个值(比如 5),并且可以使用上面的信息计算出 z 的值是 11。
您一定没有忘记,对吧。
这些字母称为变量,变量可用于保存值 (x=5) 或表达式 (z=x+y)。
JavaScript 变量
正如代数一样,JavaScript 变量用于保存值或表达式。
可以给变量起一个简短名称,比如 x,或者更有描述性的名称,比如 length。
JavaScript 变量也可以保存文本值,比如 carname="Volvo"。
JavaScript 变量名称的规则:
变量对大小写敏感(y 和 Y 是两个不同的变量)
变量必须以字母或下划线开始
注释:由于 JavaScript 对大小写敏感,变量名也对大小写敏感。
实例
在脚本执行的过程中,可以改变变量的值。可以通过其名称来引用一个变量,以此显示或改变它的值。
本例为您展示原理。
声明(创建) JavaScript 变量
在 JavaScript 中创建变量经常被称为“声明”变量。
您可以通过 var 语句来声明 JavaScript 变量:
var x;
var carname;
在以上声明之后,变量并没有值,不过您可以在声明它们时向变量赋值:
var x=5;
var carname="Volvo";
注释:在为变量赋文本值时,请为该值加引号。
向 JavaScript 变量赋值
通过赋值语句向 JavaScript 变量赋值:
x=5;
carname="Volvo";
变量名在 = 符号的左边,而需要向变量赋的值在 = 的右侧。
在以上语句执行后,变量 x 中保存的值是 5,而 carname 的值是 Volvo。
向未声明的 JavaScript 变量赋值
如果您所赋值的变量还未进行过声明,该变量会自动声明。
这些语句:
x=5;
carname="Volvo";
与这些语句的效果相同:
var x=5;
var carname="Volvo";
重新声明 JavaScript 变量
如果您再次声明了 JavaScript 变量,该变量也不会丢失其原始值。
var x=5;
var x;
在以上语句执行后,变量 x 的值仍然是 5。在重新声明该变量时,x 的值不会被重置或清除。
JavaScript 算术
正如代数一样,您可以使用 JavaScript 变量来做算术:
y=x-5;
z=y+5;
在本教程的下一节中,您将学习能够在 JavaScript 变量间使用的运算符。
JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍。
声明方式一:
使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量。该方式即为显式声明详细如下:
<script> var test = 5;//全局变量 function a(){ var a = 3;//局部变量 alert(a); } function b(){ alert(test); } //a();//调用a方法,那么方法里面的内容才会执行 //b();//同上 </script>
声明方式二:
没有使用var,直接给标识符test赋值,这样会隐式的声明了全局变量test。即使该语句是在一个function内,当该function被执行后test变成了全局变量。
<script> test = 5;//全局变量 function a(){ aa = 3;//也是全局变量 alert(test); } //a(); //输出5 //alert(aa);//这里也可以方法a()方法里面的变量,因为aa是全局变量 </script>
声明方式三:
使用window全局对象来声明,全局对象的属性对应也是全局变量,详细如下:
<script> window.test = 50; alert(test);//输出50 </script>
这种方式经常被用到一个匿名函数执行后将一些函数公开到全局。 如JQuery1.5中最末一句
代码如下:
window.jQuery = window.$ = jQuery;
全局变量的优点:
可以减少变量的个数,减少由于实际参数和形式参数的数据传递带来的时间消耗。
全局变量的缺点:
(1)全局变量保存在静态存贮区,程序开始运行时为其分配内存,程序结束释放该内存。与局部变量的动态分配、动态释放相比,生存期比较长,因此过多的全局变量会占用较多的内存单元。
(2)全局变量破坏了函数的封装性能。函数象一个黑匣子,一般是通过函数参数和返回值进行输入输出,函数内部实现相对独立。但函数中如果使用了全局变量,那么函数体内的语句就可以绕过函数参数和返回值进行存取,这种情况破坏了函数的独立性,使函数对全局变量产生依赖。同时,也降低了该函数的可移植性。
(3)全局变量使函数的代码可读性降低。由于多个函数都可能使用全局变量,函数执行时全局变量的值可能随时发生变化,对于程序的查错和调试都非常不利。
因此,如果不是万不得已,最好不要使用全局变量。
作者: 123 时间: 2017-6-2 05:08
太久1个半月了,2个客服小哥人都不错,态度也很好应该给好评,只是设计网页的设计感太一般,应该中评。
作者: xbaobeit 时间: 2017-6-7 20:52
前,很耐心解说,付款后效率很快,第二天就做好了!打开微信后确认效果不错,嗮图了
作者: a5206662 时间: 2017-6-19 16:14
的,手艺不错
作者: jzgsjt 时间: 2017-6-19 17:52
,清晰度也很合适。太划算啦
作者: xubaojin 时间: 2017-6-23 01:35
有水平,客服小妹很有耐心,虽然反复修改了很多次,但是依然十分热情。价钱也不贵。
作者: 武器 时间: 2017-6-23 06:48
了,质量很不错,和店家描述一样,好评
作者: ggt567 时间: 2017-6-24 06:02
真是收益匪浅
欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) |
Powered by Discuz! X3.2 |