var与this,{}与function 小记
JavaScript var是用来定义一个变量,this常用来定义或调用一个属性或方法。但是在全局范围内,this和var定义变量是等价的。
window
console.log('window:', name);
var name = 'stone';
this.name = 'niqiu';
console.log('var:',name);
console.log('this:',this.name);

window对象有name属性,初始值为空,但第一个console的时候怎么获取值了呢。 发现这个window记录的是上次的值。重新打开页面,只执行 console.log('window:', name); 输出为空。
console.log('window:', name);
var name = 'stone';
刷新两次后输出stone. 所以window对象在刷新的时候并没有重新创建。window是的{}对象。没有构造函数,不能new。

function与{}
在函数内部,var定义的是局部变量,而this定义的是属性。这两者没有覆盖。但新创建的对象是无法获取到局部变量的。
var Fool = function () {
var name = 'stone';
var nikename = 'stoneniqiu';
this.name = 'niqiu';
this.getName = function () {
console.log('var', name);
console.log('this', this.name);
};
this.getNickname = function() {
return nikename;
};
};
console.log(f.name); //niqiu
console.log(f.nikename);//undefined
console.log(f.getNickname());//stoneniqiu
但是如果使用{}定义对象,内部变量等于全部都是属性。
var block = {
name: 'stone',
nickname:'stoneniqiu',
getName: function () {
// return this.name;//stone
return name; //'windows name';
},
getNickname:function() {
return this.nickname;
},
printAllName:function() {
console.log(this.getNickname());
console.log(this.getName());
}
};
console.log(block.name);//stone
console.log(block.getName()); //windows name
像window对象一样,{}创建的对象不能new,因为没有构造函数。

所以如果对象复用,比较大,还是用function的形式比较好,分开私有变量和公共属性或方法,function的内部模块可以用{}的形式。
通过this可取得它们所属的上下文的方法称为公共方法。this到对象的绑定发生在调用的时候,这个“超级”延迟绑定使得函数可以对this高度复用。
this指的是当前执行的对象,为避免this发生变化。常用一个变量暂存一下this。
var self=this
神奇的回调
下面看个例子,对象的参数中定义了回调方法,但我们传入Fool自身的一个方法,居然执行了。
var Fool = function (config) {
var parmas = {
callback: function() {
console.log('raw callback');
}
};
parmas = $.extend(parmas, config);
var name = 'stone';
var nikename = 'stoneniqiu';
this.name = 'niqiu';
this.getName = function () {
console.log('var', name);
console.log('this', this.name);
};
this.getNickname = function () {
return nikename;
};
this.doSomething = function () {
parmas.callback();
};
};
var f = new Fool({callback:function() {
$("#bt").click(function() {
f.getName()
});
}});
f.doSomething();
运行无误,点击button 触发getName方法。但如果直接下面这样写,就会报错了,这错的很符合常理。
var f = new Fool({callback:f.getName()});

再修改下,用匿名函数包起来,也能跑。
var f = new Fool({callback:function() {
(function() {
f.getName();
})();
}});
f.doSomething();
今天弄明白,这其实是一个闭包问题,函数内部执行的f.getName()相当于是一个变量,它绑定外部的f,而并不是函数构建那一刻的f,所以在匿名函数构建时不会在意f是否创建了。相当于下面的这个经典问题:
var addhandle=function(node){
var i
for(i=0;i<node.length;i++){
node[i].onclick=function(e){
alert(i);
}
}
}
如果执行上面的方法,绑定的就是循环结束之后的i。而不是循环那一刻的i。上面循环中的代码如果修改成下面这样。
nodes[i].onclick=function(i){
return function(e){
alert(e)
}
}(i)
就是函数构建时的变量i了。
var与this,{}与function 小记的更多相关文章
- js中for(var key in o ){};用法小记
o不只可以是对象,key也不只可以是对象中的键. o也可以是一个数组,这时候的key就是数组的下标,从"0"开始,注意下标“0”是个字符串类型. 但是这种循环在 IE8浏览器下 对 ...
- 关于var与function的解析顺序问题
先给几段代码,看看你能知道运行结果不 function example1() { var f = function() {return 1;}; return f; var f = function( ...
- javascript精雕细琢(一):var let const function声明的区别
目录 引言 一.var 二.let 三.const 四.function 五.总结 引言 在学习javascript的过程中,变量是无时无刻不在使用的.那么相对应的,变量声明方法也如是. ...
- 从var func=function 和 function func()区别谈Javascript的预解析机制
var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function ...
- JavaScript 闭包小记
最近朋友面试被问到了 JS 闭包的问题,本人一时语塞,想起了袁华的一句话:“这道题太难了,我不会做,不会做啊!”. JS 闭包属于面向对象的一个重要知识点,特此本人又开始了一段说走就走的旅程. 闭包就 ...
- select2插件使用小记2 - 多选联动 - 笔记
这是select2插件使用的第二篇,可参考第一篇 select2插件使用小记.上一篇主要是关于基本的使用,这篇主要是关于多选,及联动的.侧重点不同. 效果图如下: 遵从W3C标准:结构.样式.行为.以 ...
- JavaScript小记
JavaScript小记 1. 简介 1. 语言描述 JavaScript 是一门跨平台.面向对象的弱类型动态脚本编程语言 JavaScript 是一门基于原型.函数先行的语言 JavaScript ...
- Function.prototype.toString 的使用技巧
Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...
- js Function()构造函数
var scope="global"; function constructFunction(){ var scope="local"; ...
随机推荐
- 对 web.config 节点信息进行加密
记录一下,免得以后再网上找 项目中,数据库访问链接字符串配置在web.config中,明文的,应客户需求需改成密文,so,需要加密. 一开始想的是需要重写configuration什么什么的,最后发现 ...
- IEEE二进制浮点数算术标准学习
看到有网上有个项目是要求将浮点数用二进制表示出来,需要用IEEE754标准,查了查维基和深入理解计算机系统,重新学习了一遍浮点数在计算机中的表示和内存中的存储, 先简单的做个笔记,后面需要更深入的理解 ...
- AndroidLinker与SO加壳技术之下篇
点此查看上篇<AndroidLinker与SO加壳技术之上篇> 2.4 链接 链接过程由 soinfo_link_image 函数完成,主要可以分为四个主要步骤: 1. 定位 dynami ...
- SQL Server Bulk Insert批量数据导入
SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...
- 设计模型MVC和JavaBean
六.设计模型1和设计模型2(MVC)1.模型1:JSP+JavaBean2.模型2:MVC M:Model模型 JavaBean V:视图 JSP C:控制器 Servlet 七.模型1开发一个简单的 ...
- iOS常用公共方法
iOS常用公共方法 字数2917 阅读3070 评论45 喜欢236 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat si ...
- hd 2112 HDU Today
Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...
- ubuntu添加桌面或launcher快捷方式
以eclipse为例,自行下载的. 创建文件/usr/share/applications/eclipse-kepler.desktop 文件内容: #------------------------ ...
- js基础知识点总结
如何在一个网站或者一个页面,去书写你的js代码:1.js的分层(功能):jquery(tool) 组件(ui) 应用(app),mvc(backboneJs)2.js的规划():避免全局变量和方法(命 ...
- loadrunner回放脚本报错27780:“[10053] 软件导致连接中止”
录制的脚本在回放时报错,错误如下: vuser_init.c(12): 警告 -26627: 对于“http://bsp.paycenter.58.com.cn/favicon.ico”,HTTP 状 ...