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的更多相关文章

  1. JS基础_函数作用域

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 对JS闭包和函数作用域的问题的深入讨论,如何理解JS闭包和函数作用域链?

    首先先引用<JavaScript权威指南>里面的一句话来开始我的博客:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 因此,就出现了如下的几串代码: ...

  3. 关于JS里的函数作用域链的总结

    在JavaScript中,函数的作用域链是一个很难理解的东西.这是因为JavaScript中函数的作用域链和其他语言比如C.C++中函数的作用域链相差甚远.本文详细解释了JavaScript中与函数的 ...

  4. JS基础_函数作用域练习

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 变量作用域&函数作用域

    一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...

  6. js 碎片整理(变量声明,函数作用域)

    1.变量声明: 在非严格模式下,函数可以对未声明的变量赋值,而这样赋值的结果就是该变量就会变成全局变量. (function(){ var a = 1; })(); console.log(a) ; ...

  7. JS函数——作用域

    一 : 作用域的相关概念 首先看下 变量作用域 的概念:一个变量的作用域是程序源代码中定义这个变量的区域.————————<javascript权威指南>第六版全局变量拥有全局作用域,函数 ...

  8. JS 函数作用域及变量提升那些事!

    虽然看了多次js函数作用域及变量提升的理论知识,但小编也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷) ...

  9. JS 字符串对象 数组对象 函数对象 函数作用域

    一.内置对象 object对象:ECMAScript 中的所有对象都由这个对象继承而来:Object 对象中的所有属性和方法都会出现在其他对象中 ToString() : 返回对象的原始字符串表示.V ...

  10. JS _函数作用域及变量提升

    虽然看了多次js函数作用域及变量提升的理论知识,但也是一知半解~ 这几天做了几道js小题,对这部分进行了从新的理解,还是有所收获的~ 主要参考书籍: <你不知道的JavaScript(上卷)&g ...

随机推荐

  1. Stars in Your Window POJ - 2482

    错误记录: 题目说输入在int范围内,但是运算过程中可能超int:后来开了很多longlong就过了 #include<cstdio> #include<algorithm> ...

  2. 1-16使用try-catch捕捉异常

    处理异常 可以使用try-catch-处理异常,例如之前的程序可以使用try-catch-处理 package com.monkey1024.exception; import java.io.Fil ...

  3. 转--oracle查看允许的最大连接数和当前连接数等信息

    两个参数间的关系:sessions=1.1*processes+5 目前总结的语句,在查看数据的连接情况很有用,写完程序一边测试代码一边查看数据库连接的释放情况有助于分析优化出一个健壮的系统程序来. ...

  4. java中同步(synchronized)详解

    一.开山篇: 1.synchronized的使用 一个程序中,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简 ...

  5. help命令

    help——获得Shell内置命令的帮助信息 命令所在路径:Shell内置命令 示例1: # help cd 使用which或者whereis查找不到路径的命令一般是Shell内置命令,cd就是一个S ...

  6. Android(java)学习笔记164:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例)

    1.首先我们看看下面这个需求: 这里我们在A界面上,点击这个按钮"选择要发送的短信",开启B界面上获取网络上各种短信祝福语,然后B界面会把这些网络祝福语短信发送给A界面到" ...

  7. Android(java)学习笔记161:开发一个多界面的应用程序之人品计算器的简单实现

    1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义")  记得在清单文件中声明 (3)intent.setData(前 ...

  8. Docker下redis的主从配置

    1.拉取redis镜像docker pull redis2.启动3个redis容器服务,分别使用到6379.6380.6381端口docker run --name redis-6379 -p 637 ...

  9. 数组排序 sort

    数组排序 this.dataShow = this.data.sort((a, b) => { return parseInt(a[this.innerOrderBy]) - parseInt( ...

  10. 插入insert几种用法

    1.insert ignore into 当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回.所以使用ignore请确保语句本身没有问题,否则也会被忽略掉.例如: INSERT I ...