js总结(二):函数、作用域和this
- function Container( properties ) {
- var objthis = this;
- for ( var i in properties ) {
- (function(){ //闭包,一个封闭的区域,t仅仅在这个区域有效,不能对properties的值做任何修改
- var t = properties[i];
- objthis[ "get" + i ] = function() {return t;};
- objthis[ "set" + i ] = function(val) {t = val;};
- })();
- }
- }
- var prop = {Name : "Jim", Age : 13};
- var con = new Container(prop);
- console.log(con.getName()); //Jim
- con.setName("Lucy");
- console.log(con.getName()); //Lucy
- console.log(prop.Name);//Jim
- function Container( properties ) {
- var objthis = this;
- for ( var i in properties ) {
- // (function(){
- // var t = properties[i];
- objthis[ "get" + i ] = function() {return properties[i]};
- objthis[ "set" + i ] = function(val) {properties[i] = val;};
- // })();
- }
- }
- var prop = {Name : "Jim", Age : 13};
- var con = new Container(prop);
- console.log(con.getName());//13 getName返回的是properties[i],这个时候i已经指向了最后一位,就是13
- console.log(con.getAge()); //13
- con.setName("Lucy");
- console.log(con.getName()); //Lucy 把最后那个变成lucy了
- console.log(prop.Name);//Jim
- console.log(prop.Age);//Lucy
闭包通过引用而不是值来捕获他的外部变量
使用立即调用的函数表达式,来创建局部作用域
值类型,1:基本类型是值类型,可以用typeof判断,2:占用空间固定保存在栈中 3:保存与复制的是值本身
引用类型 2:使用new 方法创建的对象,使用instanceof判断类型2:占用空间不固定,保存在堆中 3:保存与复制的是指向对象的指针。
关于传递的例子:
- var a = [1,2,3]
- var b = function(array){
- array = [4,5,6]
- console.log(array)// [4, 5, 6]
- }
- b(a);
- console.log(a)//[1, 2, 3]
- var a = [1,2,3];
var b = function(array){
array.push(4);
console.log(array);// [1,2,3,4]
- }
b(a);
console.log(a)//[1, 2, 3,4]
赋值是靠等于号(=),这样相当于是局部变量了,不会对原有的值改变。
相当于都是引用传递,用等于号相当于给变量赋予一个新的地址,如果继续改变原来地址的值,使用其他方法,2个都会变化。
参考: http://www.cnblogs.com/52cik/archive/2014/07/01/js-assignment-operators.html
- var a =1;
function b (x, y, a) {- arguments[2] = 10;
- alert (a);//10
- }
- b(1, 2, 3);
console.log(a)//1
二、作用域
函数确定一个作用域的范围,一个变量如果没有定义在函数内,他就是全局变量了。
一个变量在函数里面任何地方声明,都相当于在函数的前面声明,这就是变量提升。
当js查找与关系值时,会遵循一个查找链。这就是作用域链,作用链查找返回的是第一个轮值。也就是谁离得近。
内层函数可以访问外层函数的局部变量,外层函数不能访问内层函数的局部变量。
局部变量高于同名全局变量,参数变量高于同名全局变量,局部变量高于同名参数变量。
全局变量是全局(head/window)对象的属性,局部变量是调用对象的属性,局部变量是那个函数的属性。
this是指的谁调用这个函数了,就是函数前面的.(点),如果直接调用函数相当于window. ,用点调用方法来执行这个函数。
在嵌套函数里面引用this,引用的是head对象(window)
- var a = 1,
- b = function a (x) {
- x && a (--x);
- };
- console.log (a);//1
- function a (x) {
- return x * 2;
- }
- var a;
console.log (a);//function a()
- if (!("a" in window)) {//console.log(undefined in window); true undefined也在window里面
- var a = 1;
- }
console.log (a);//undefined
作用域链就是查找返回的第一个值。函数定义时确定作用域,而非调用时
- var a =function(){
- var foo = "foo"
- return function(){
- console.log(foo)
- }
- }
- var b =a() ;
- b();//"foo"
- var a = 10;
- var AAA = function (){
- console.log(this.a);
- }
- var b = {a:2,bbb:AAA};
- b.bbb();
- var test=function(){
- var a=1;
- setTimeout(function(){
- console.log(a);
- a=2;
- },1000);
- a=3;
- setTimeout(function(){
- console.log(a);
- a=4;
- },2000);
- };
- test();
三、this
创建函数时,系统会在后台创建一个名为this的关键字,它连接到运行该函数的对象。this对函数的作用域是可见的,而且它是函数所在对象的一个引用
- if (typeof Array.prototype.forEach != "function") {
- Array.prototype.forEach = function (fn, context) {
- for (var k = 0, length = this.length; k < length; k++) {
- if (typeof fn === "function" && Object.prototype.hasOwnProperty.call(this, k)) {
- fn.call(context, this[k], k, this);
- }
- }
- };
- }
- function a () {
- console.log (this);//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
- }
- a.call (null);
js总结(二):函数、作用域和this的更多相关文章
- JS基础_函数作用域
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 对JS闭包和函数作用域的问题的深入讨论,如何理解JS闭包和函数作用域链?
首先先引用<JavaScript权威指南>里面的一句话来开始我的博客:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 因此,就出现了如下的几串代码: ...
- 关于JS里的函数作用域链的总结
在JavaScript中,函数的作用域链是一个很难理解的东西.这是因为JavaScript中函数的作用域链和其他语言比如C.C++中函数的作用域链相差甚远.本文详细解释了JavaScript中与函数的 ...
- JS基础_函数作用域练习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 变量作用域&函数作用域
一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...
- js 碎片整理(变量声明,函数作用域)
1.变量声明: 在非严格模式下,函数可以对未声明的变量赋值,而这样赋值的结果就是该变量就会变成全局变量. (function(){ var a = 1; })(); console.log(a) ; ...
- JS函数——作用域
一 : 作用域的相关概念 首先看下 变量作用域 的概念:一个变量的作用域是程序源代码中定义这个变量的区域.————————<javascript权威指南>第六版全局变量拥有全局作用域,函数 ...
- JS 函数作用域及变量提升那些事!
虽然看了多次js函数作用域及变量提升的理论知识,但小编也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷) ...
- JS 字符串对象 数组对象 函数对象 函数作用域
一.内置对象 object对象:ECMAScript 中的所有对象都由这个对象继承而来:Object 对象中的所有属性和方法都会出现在其他对象中 ToString() : 返回对象的原始字符串表示.V ...
- JS _函数作用域及变量提升
虽然看了多次js函数作用域及变量提升的理论知识,但也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷)&g ...
随机推荐
- Plugging an Unplugged Pluggable Database
1.unplug To unplug a PDB, you first close it and then generate an XML manifest file. The XML file co ...
- 使用callabestatement接口调用存储过程
- CentOS 6.9:ntpdate[3115]: no server suitable for synchronization found
在做一个集群实验,克隆的虚拟机,然后使用ntpdate就抛出了错误.机器之间可以互相ping通,selinux和iptables都已经关闭. [root@Server_2 ~]# service nt ...
- Android开发-浅谈架构(二)
写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...
- js数组去重的三种方式的比较
做前端的,一般实现功能是主要的,但是重中之重却是在做到功能完善的情况下提高性能. 1.遍历数组法 实现的思路:构建一个新的数组存放结果,for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组 ...
- P1789 【Mc生存】插火把
题目背景 初一党应该都知道...... 题目描述 话说有一天linyorson在Mc开了一个超平坦世界,他把这个世界看成一个n*n的方阵,现在他有m个火把和k个萤石,分别放在x1,y1...xm,ym ...
- MySQL系列:隐式类型转化可能带来的坑
在开发规范中,我们往往会要求研发避免在where条件中出现隐式类型转换,这么要求大概有以下两方面的原因: 隐式类型转换可能导致索引失效: 隐式类型转换可能产生非预期的结果. 注:这里说的是隐式类型转换 ...
- 【经验总结】关于使用某些第三方插件库元素设置display:none后重新show不显示的问题;(display、opacity、宽高0的使用场景)
display:none 直接取消元素所占用的位置(但是元素还是存在的),后面元素看他就相当于不存在了: opacity:0 隐藏,但是其依旧占用位置: height.width:0 和displa ...
- js中json处理总结之JSON.parse
踩过的坑都将成为路上的风景.队友在cookie中已存以下值: address_info {"address_name":"人民大会堂","...lng ...
- 64位系统上32位进程拷贝文件到System32目录时的重定向
64位系统上,32位进程拷贝文件到"System32"目录时,会被文件系统重定向到"SysWOW64"目录 要禁用这种重定向,需要用到下面2个API: Wow6 ...