JavaScript模拟局部变量整理

本文介绍了在ES5中模拟局部变量的多种方法,并对比了ES6中的let关键字如何更简洁地实现局部变量。通过创建对象和使用函数作用域,作者展示了如何限制变量的访问范围。
在ES5中变量边界有两个,一是全局范围,二是函数范围,没有一般语言的作用域范围,比如
{
    var a = 1;
}
console.log(a); //1
上面会输出1,然而我们希望a仅仅局限于自己最近的括号内,而在括号外为未定义undefined,也即一般编程语言的局部变量。

本文是学习ES5时整理的模拟局部变量的奇巧淫技,现在看来相当于是回字的x种写法,已经无任何意义。因为在ES6中终于引入了let关键字来解决这个问题:
{
    let a = 1;
}
console.log(a); //undefine
非常完美,正常。然而作为一个回忆吧,还是把过去的奇巧淫技整理如下。

---------------奇巧淫技-----------------------------------
很惊人,原来这样简单都可以形成局部变量:

第一种
var person = new Object();
(function(){
var name = "inner_name";
person.getName = function(){
    return name;
}
})(); //这里执行后,生成了一个原本应该马上消失的作用域空间,但是因为被外界的person引用而不能释放
alert(person.getName());

第二种
var person = new Object();
(function(){
    var name = "inner_name";
    person.name = name; //这里不一定行,除非name是引用类型,否则这里是变量拷贝
})(); //这里执行后,函数内部变量被外部person引用 ???? alert(person.name);

以上是比较普遍的例子。从这个例子可见,这其实是一件很简单的事情,其本质是:
1,函数内部变量是私有的
2,执行函数,生成其内部变量,但是让外部对象引用这个内部变量
3,函数执行完毕,但是内部空间及内部变量被保存下来了,而没有被释放

仔细想,我们究竟想要什么样的内部私有变量?我们的期望包括:
其一:不可以用点号来索引该变量,包括读出或写进,比如o.name
其二:可以通过某些方法来操作该变量
我们正好就实现了这两点

继续尝试一下。

第三种:
var person = function(){
    var inner_name = "inner_name";
    this.inside_name = "inside_name";
};
alert(person.inner_name);//显示undefined
alert(person.inside_name);//显示undefined
本例person指向一个静止不动的函数对象,由于没有运行,其函数内部作用域的变量是不存在的

第三种之二
var person = function(){
    var inner_name = "inner_name";
    this.inside_name = "inside_name";
};
person.new_name = "new_name"
alert(person.new_name);
这里的new_name不是内部变量,而是person作为普通对象的属性

第四种:
function func_inner(){
    this.name = "inner_name";
};
var person = new func_inner();//当构造函数用,返回this
alert(person.name);//显示inner_name

第五种:
function func_inner(name){
    this.getName = function(){
         return name;
    }
};
var person = new func_inner("in_name");
alert(person.getName());//返回in_name

第六种:
var person = (function(){
    var o = new Object();
    o.inner_name = "inner_name";
    return o;
})();
alert(person.inner_name);//返回inner_name

总结:
    静态存在的函数对象,其内部变量并不存在
    函数对象执行了,其内部变量会生成,可以被return出来,也可以被引用出来,只要被指向,这些内部变量就不会丢失
    被当成构造函数被调用也是一样
    可以直接引用,也可以通过方法来引用,我们需要的是,在引用出来后,只能通过方法操作,而不能用点号操作,这样就形成了内部私有变量

.版本 2 .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 ' 定义变量 局部变量 账号, 文本型 局部变量 密码, 文本型 局部变量 网页地址, 文本型 局部变量 浏览器对象, 对象 局部变量 登录表单, 对象 局部变量 账号输入框, 对象 局部变量 密码输入框, 对象 局部变量 登录按钮, 对象 局部变量 表格对象, 对象 局部变量 表格行数, 整数型 局部变量 表格列数, 整数型 局部变量 行, 整数型 局部变量 列, 整数型 局部变量 单元格内容, 文本型 局部变量 Excel对象, 对象 局部变量 工作表对象, 对象 ' 获取输入的账号、密码和网页地址 账号 = 编辑框1.内容 密码 = 编辑框2.内容 网页地址 = 编辑框3.内容 ' 创建浏览器对象 创建对象 (浏览器对象, "InternetExplorer.Application") 调用对象方法 (浏览器对象, "Navigate", 网页地址) ' 等待网页加载完成 延迟 (10000) ' 等待 10 秒,可根据实际情况调整 ' 获取登录表单和输入框 调用对象方法 (浏览器对象, "Document", 登录表单) 调用对象方法 (登录表单, "getElementById", "username", 账号输入框) ' 假设账号输入框的 ID 为 "username" 调用对象方法 (登录表单, "getElementById", "password", 密码输入框) ' 假设密码输入框的 ID 为 "password" 调用对象方法 (登录表单, "getElementById", "loginButton", 登录按钮) ' 假设登录按钮的 ID 为 "loginButton" ' 输入账号和密码 调用对象方法 (账号输入框, "Value", 账号) 调用对象方法 (密码输入框, "Value", 密码) ' 点击登录按钮 调用对象方法 (登录按钮, "Click") ' 等待登录完成 延迟 (5000) ' 等待 5 秒,可根据实际情况调整 ' 获取表格对象 调用对象方法 (浏览器对象, "Document", 登录表单) 调用对象方法 (登录表单, "getElementsByTagName", "table", 表格对象) ' 创建 Excel 对象 创建对象 (Excel对象, "Excel.Application") 调用对象方法 (Excel对象, "Workbooks", "Add", 工作表对象) ' 遍历表格数据并写入 Excel 表格行数 = 调用对象方法 (表格对象, "Rows", "Length") 表格列数 = 调用对象方法 (表格对象, "Columns", "Length") .计次循环首 (表格行数, 行) .计次循环首 (表格列数, 列) 调用对象方法 (表格对象, "Rows", 行, "Cells", 列, "innerText", 单元格内容) 调用对象方法 (工作表对象, "Cells", 行, 列, "Value", 单元格内容) .计次循环尾 () .计次循环尾 () ' 保存 Excel 文件 调用对象方法 (Excel对象, "ActiveWorkbook", "SaveAs", "C:\output.xlsx") ' 保存到指定路径 调用对象方法 (Excel对象, "Quit") ' 关闭 Excel 应用程序 ' 关闭浏览器 调用对象方法 (浏览器对象, "Quit") 信息框 (“数据已成功写入 Excel 文件!”, 0, “提示”, )
最新发布
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值