一、变量

在javascript变量中可以存放两种类型的值:原始值和引用值。

原始值存储在栈上的简单字段,也就是值直接存储在变量所标示的位置内。

引用值存储在堆内的对象,栈内变量保存的是指向堆内对象的指针值。

在javascript中有5种基本类型:Undefined,Null,Boolean,Number,String。

引用类型其实就是对象,类似其他语言中类实例的概念。

var b =true; // 存储在栈上
var num =20; //存储在栈上
var b =new Boolen(true); //存储在堆内
var num =new Number(20); // 存储在堆内

通常生成对象的方式 :

new +类型名称 var obj = new object()

如果没有参数也可以写成 var obj = new object;

还可以用对象字面量生成对象 var obj = {}

二、函数

在javascript 中函数就是对象,应该像对待javascript中其他对象一样对待函数,每个函数都隐式附加两个额外参数this,arguments。

函数可以:赋值给变量,作为其他对象的属性,作为其他函数的参数,作为返回值,还可以用字面量来创建函数。

函数上下文:

在面向对象语言里用this关键字引用类对象的当前实例。javascript里的this关键字却不同于面向对象语言中的this。在javascript中,函数就是对象, this引用的是调用当前函数的函数上下文。

可以通过call()和apply()方法来显式的指定函数上下文。Call的第一个参数被用来作为调用函数的上下文,其他参数作为被调用函数的参数传入被调用函数。Apply()和Call()差不多,只不过第二个参数是数组。

var obj = {
m:"hello"
}
var m="hi";
var say=function()
{
alert(this.m); //this指向函数调用上下文
}
say();//hi,window为调用上下文
say.call(obj);// hello,此时obj为函数调用上下文
say.call(window);// hi,window为调用上下文

作用域:

定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的。

var obj =function() {
var num =1;
return { getValue: function() {
alert(num); //undefined
var num =2;
alert(num); //2
}
}
} ();
obj.getValue();

闭包

所谓闭包就是函数能使用函数外定义的变量,函数可以访问创建时的上下文环境。

var hello ="hello word!";
function sayHello() {
alert(hello);
}
sayHello();
var obj =function() {
var value =0;
return {
setValue: function(val) {
value +=typeof val ==='number'? val : 1;
},
getValue: function() {
return value;
}
}
} ();

obj.setValue('a');
alert(obj.getValue()); //1

注意最后一行的(),()是调用运算符,它表示函数立即调用并返回调用结果。所以obj并不是引用函数,而是引用该函数返回的一个包含两个方法的对象,而且这两个方法享有访问value变量的特权。

再举个网上流传很广的内部函数访问外部函数局部变量例子来说明闭包。点击相应的列表项弹出对应的顺序编号。

<li id="a">test1</li>
<li id="b">test2</li>
<li id="c">test3</li>

var test =function() {
var num = document.getElementsByTagName("li");
var i;
for (i =0; i < num.length; i++) {
num[i].onclick =function() {
alert(i); //内部函数可以访问外部函数变量,i的最终值是3,
//而不是构造函数时的i值,所以此处都弹出3
}
}
alert(i); //3
}
test();

下面这个写法可以获得正确的结果:

var test =function() {
var num = document.getElementsByTagName("li");
var i;
for (i =0; i < num.length; i++) {
num[i].onclick =function(i) {
returnfunction() {
alert(i +1);
}
} (i); //每次构造函数时立即把i值传进去执行,现在onclick绑定的函数是执
//行后返回的函数
}
alert(i); //3
}
test();

转载:http://www.cnblogs.com/qiuwuyu/archive/2011/02/21/1959411.html

转载于:https://www.cnblogs.com/gaoxu387/archive/2011/09/01/2161631.html

Javascript变量函数浅谈相关推荐

  1. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  2. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

  3. php防变量注入,浅谈PHP防注入

    某年某月某日某时某分某秒,某人在阅读某PHP程序代码时,发现某处将输入"直接"带入查询语句,当他兴冲冲地抄起阿D时,却没有注入点(magic_quotes_gpc为off).当他仔 ...

  4. java javascript数组_浅谈javascript和java中的数组

    javascript中的数组 数组的创建 直接创建方式  var str = ['java', 'js']; 使用new创建方式: var a = new Array(10);  //  定义长度为1 ...

  5. android 箭头函数,浅谈箭头函数

    ES6新引入了箭头函数,它是一种表达简洁的函数,下面我们来看看它有哪三个显著优势. 假设定义了一个名为names的数组,如下: 现在需要给数组的每一项后面添加'Bos'这个字符串,如果用传统的函数语句 ...

  6. ORACLE日期函数浅谈

    ORACLE日期函数大全! 日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历, 比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计 ...

  7. linux 环境变量 alias,浅谈linux alias别名的设置

    alias 命令: alias 功能说明:设置命令的别名 语法:alias [命令]='其他命令' 例: [root@oldboyedu-vm1 data]# alias alias cp='cp - ...

  8. JavaScript 面向对象编程浅谈

    Created by Yiyi_coding Last edited at 2016年7月22日 JavaScript创建对象的几种方式? 第一种: 对象字面量的方式 var person = {fi ...

  9. c++引用matlab类,matlab调用C++函数浅谈(一)

    由于在下才疏学浅,在网上看各高手指南时亦觉云里雾里,遂决定一切说明从最基础说起,一是方便自己(记性奇差),二是方便似我的小白.以下部分是我从各网站论坛等摘抄.重组.改写过的,以求更加详实明朗,由于参考 ...

最新文章

  1. 使用Python+Pycaret进行异常检测
  2. 5.2 matlab多项式计算(多项式的四则运算、求导、求值、求根)
  3. Programming Computer Vision with Python (学习笔记九)
  4. 第一章 统计学概论
  5. Java线程中关于Synchronized的用法
  6. 网格自适应_ANSYS 非线性自适应(NLAD)网格划分及应用举例
  7. runtime批处理mysql导出_【原】使用批处理BAT文件处理Mysql数据库 | 学步园
  8. OpenShift 4 之Service Mesh教程(5)- 断路器Circuit Breaker
  9. yii beforeaction 如何赋值全局变量_前端如何进行用户权限管理
  10. 一个共享XP、2003上文件与打印机简单易行的方法
  11. php站长统计,如何巧妙去除隐藏“站长统计”文字链接?
  12. 31、【栈和队列】判断链表是否为中心对称(C++版)
  13. PostgreSQL数据库部署之 :PostgreSQL pgadmin4 the application server could not be contacted
  14. error: (-5:Bad argument) in function ‘seamlessClone‘ 和error: (-215:Assertion failed) 0 <= roi.x 0
  15. 可落地的DDD(6)-工程结构
  16. 多彩的产品之年——产品经理一席谈
  17. 软件工程学习笔记(一)
  18. 关于电脑pe系统介绍
  19. 2020 5G通信与天线产业技术报告会盛大召开!
  20. 微信小程序使用canvas制作拼图动画

热门文章

  1. sdi线缆标准_Roland V1SDI——专业、便携、高性价比的SDI摄像机直播解决方案
  2. 如何完美隐藏Disposable的存储和销毁过程(二)
  3. (转载)KVM is required to run this AVD /dev/kvm permission denied Ubuntu Android Studio
  4. 开发日记-20190712 关键词 读书笔记 《Perl语言入门》Day 8
  5. Markdown 语法介绍
  6. unicode字符串 转 中文
  7. angular1x初始与架构演进(一)
  8. 并发编程协程(Coroutine)之Gevent
  9. Tomcat配置虚拟路径访问容器外的硬盘资源
  10. 在使用添加按钮给table插入新的一行时遇见的问题总结及处理方法