浅说js变量


Posted in Javascript onMay 25, 2011
/* 
1, 变量类型: 
JavaScript 是弱类型, 变量可存储任意类型, 并且运行期间类型可变; 
-> 变量可进行类型转换; 
*/ 
/* 
2, 变量声明: 
*/ 
var i; 
var index; 
var i, index; 
var i = 0, index = 2; 
/* 
变量声明, 无初始值时, 值为 undefined; 
并且 var 声明的变量, 不能使用 delete 操作符删除; 
重复声明为产生覆盖, 不会造成错误; 
遗漏声明, 则会把变量隐式声明此变量, 并做为全局变量; (下节介绍) 
*/ 

/* 
3, 变量作用域: 
以函数划分: 函数内部声明的变量, 只能运行的函数内部, 即局部变量; (闭包仍可引用); 
内部变量比全局变量优先级别高; ex: 
*/ 
var g = 'global'; 
function check() { 
var g = 'local'; 
console.log(g); // local 
} 
check(); 
/* 变量尽可能都使用 var 声明 */ 
/* 没有块级作用域 */ 
if (false) { 
var test = 2; 
function t() { 
console.log('t function'); 
} 
} 
t(); // t function; 
console.log(test); // undefined; 
/* 
例外: 
firefox 会报错; 
t is not defined; 
test 值为 undefined;(末声明和赋值的变量都是 undefined) 
*/ 
/* 变量声明会提前挂起 */ 
function f() { 
console.log(test); // undefined 
var test = 'test'; 
console.log(test); // 'test' 
} 
// 转化为 
function f() { 
var test; 
console.log(test); // 变量仅声明, 则初始化为 undefined 
test = 'test'; 
console.log(test); // 变量已赋值, 'test' 
} 
/* 未定义变量和未赋值变量 */ 
console.log(t); // 直接使用变量 t; 
// 注: 直接给变量赋值时, 会隐式的把变量做为全局对待; 
var t; // 未赋值变量, undefined; 
/* 
4, 基本类型和引用类型: 
Number/boolean/null/undefined/ 基本类型; 
Array/Object/Function 引用类型 
第五版, 63页: 
无论将字符串看作是行为与基本类型相似的不可变引用类型, 
还是将它看作使用引用类型的内部功能实现的基本类型, 结果都是一样的; 
即: String 类型表现为 基本类型; 
下面实例说明基本类型和引用类型差别: 
*/ 
var a = 3.14; 
var b = a; 
a = 4; 
console.log(a, b); // 4, 3.14; 
var a = [1, 2, 3]; 
var b = a; 
a[0] = 99; 
console.log(a, b); // 相同; [99, 2, 3]; 
// 数组是引用类型, 变量a和b 指向同一块内存地址; 
// 变量保存基本类型的实际值, 而保存引用类型的引用(类指针); 
/* 
5, 垃圾收集 
引用类型是没有固定大小的, 比如: Array, 随时可以修改 length; 
变量并不能直接保存引用的值, 而是被存储在某个位置, 变量保存的只是对此位置的引用. 
所以, JavaScript 会动态分配内存来存储实体; 
最终要释放这些内存以便再用, 否则会消耗所有可用内存导致系统崩溃; 
JavaScript 不要求手动释放内存; 它使用一种称为垃圾收集方法[方法不可见]; 
它会把对不再使用的对象所占用的内存释放; 
*/ 
var s = 'hello'; 
var u = s.toUpperCase(); 
s = u; // 不能再获取到 'hello' 值; 
// 环境中不再有 'hello' 引用[没有变量指向它] 
// (是否进行回收, 是通过是否存在赋值决定的) 
/* 
6, 作为属性的变量 
全局对象 
window, this, Math; 
浏览器中的:navigator, screen; 
局部变量:调用对象 
调用对象 
全局变量是特殊的全局对象的属性, 那么局部变量被称为调用对象(call object)的属性; 
函数的参数和局部变量作为调用对象的属性而存储; 
(使用独立对象存储局部变量使 JavaScript 可防止局部变量覆盖同名全局变量的值) 
JavaScript 的执行环境 
JavaScript 解释器执行一个函数时, 会为函数创建一个执行环境(execution context); 
一个执行环境就是所有 JavaScript 代码段执行时所在的环境. 
运行不属性任何函数的 JavaScript 代码的环境使用的就是全局对象. 
所有 JavaScript 函数都运行在 自己独有的执行环境中, 并且有自己的调用对象, 在调用对象中定义了局部变量. 
JavaScript 解释器可在不同的全局执行环境中运行脚本, 并且这些环境不脱节, 彼此可引用; 
(window-iframe); 
深入理解变量作用域 
每个 JavaScript 执行环境都有一个和它关联在一起的作用域链(scope chain); 
作用域链是一个对象列表或对象链; 
当 JavaScript 代码需要查询变量 X 的值时, 它就开始查看此链上的第一个对象; 
如果对象存在一个名为 x 的属性, 那么就采用那个属性的值. 
如果没有, JavaScript 会继续查询链中的第二个对象. 
如果还没有找到, 继续查询下一个对象. 以此类推... 
补充: 
f() 作用域 -> 闭包作用域 -> var 变量所在作用域 
-> Object 的原型作用域 -> Object 类属性作用域 
-> 顶层作用域(window); 
*/
Javascript 相关文章推荐
比较搞笑的js陷阱题
Feb 07 Javascript
javascript中解析四则运算表达式的算法和示例
Aug 11 Javascript
window.location.reload 刷新使用分析(去对话框)
Nov 11 Javascript
基于Javascript实现的不重复ID的生成器
Dec 25 Javascript
js实现图片360度旋转
Jan 22 Javascript
vue-loader教程介绍
Jun 14 Javascript
JQuery扩展对象方法操作示例
Aug 21 jQuery
JavaScript中Array方法你该知道的正确打开方法
Sep 11 Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 Javascript
微信小程序实现时间进度条功能
Nov 17 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 Javascript
潜说js对象和数组
May 25 #Javascript
一些常用的JavaScript函数(json)附详细说明
May 25 #Javascript
javascript中万恶的function实例分析
May 25 #Javascript
js 页面关闭前的出现提示的实现代码
May 25 #Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
May 25 #Javascript
IE6/7/8/9不支持exec的简写方式
May 25 #Javascript
25个优雅的jQuery Tooltip插件推荐
May 25 #Javascript
You might like
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
2010/10/12 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
php微信开发之谷歌测距
2018/06/14 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
javascript 新浪背投广告实现代码
2009/07/07 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python根据服务获取端口号的方法
2019/09/25 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
pytorch的batch normalize使用详解
2020/01/15 Python
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
运动会开幕式邀请函
2014/01/22 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
六一儿童节开幕词
2015/01/29 职场文书
学生会主席任命书
2015/09/21 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
Python连续赋值需要注意的一些问题
2021/06/03 Python