Javascript 函数的局部变量未获取参数值
这对我来说似乎很奇怪。我有Javascript 函数的局部变量未获取参数值,javascript,function,scope,arguments,var,Javascript,Function,Scope,Arguments,Var,这对我来说似乎很奇怪。我有 var j = "x"; var k = "y"; function fun1 ( a, b) { var j = a; var k = b; console.log("this.j is:", this.j); console.log("this.k is:", this.k); this.j = a; this.k = b; return this.j + this.k; }; console.log("j is ", j); co
var j = "x";
var k = "y";
function fun1 ( a, b) {
var j = a;
var k = b;
console.log("this.j is:", this.j);
console.log("this.k is:", this.k);
this.j = a;
this.k = b;
return this.j + this.k;
};
console.log("j is ", j);
console.log("k is ", k);
console.log("fun1(3,4) is ", fun1(3,4));
console.log("j is ", j);
console.log("k is ", k);
console.log("fun1(2,7) is ", fun1(2,7));
console.log("j is ", j);
console.log("k is ", k);
当我在Node.js中运行此命令时,我得到:
j is x
k is y
this.j is: undefined
this.k is: undefined
fun1(3,4) is 7
j is x
k is y
this.j is: 3
this.k is: 4
fun1(2,7) is 9
j is x
k is y
为什么j和k在声明时没有被设置为函数中的参数a和b?我必须同时做var j=a,这似乎是不对的;这个。j=a!!我做错了什么
在node中,输出正确地显示全局中的j和k变量没有被fun1中的局部变量j和k碰撞。当我在Chrome或Firefox中运行这个程序时,全局变量确实会被破坏。换句话说,我明白了
j is x
k is y
this.j is: undefined
this.k is: undefined
fun1(3,4) is 7
j is 3
k is 4
this.j is: 3
this.k is: 4
fun1(2,7) is 9
j is 2
k is 7
为什么局部范围不能保护全局var
谢谢你的提示。我建议你去读一下!:这正好解释了如何使用这个以及这个是什么! 这里是文章,如果链接是死的。抱歉,格式不完善,文本很长 总结 函数的this关键字在JavaScript中的行为稍有不同 与其他语言相比。两者之间也有一些区别 严格模式和非严格模式 在大多数情况下,其值由函数的运行方式决定 打电话。它不能在执行期间通过赋值进行设置,可能是 每次调用函数时都会发生变化。ES5引入了bind 方法来设置函数this的值,而不管它是如何设置的 打电话来 在外部的全局执行上下文中对该全局上下文进行语法分析 任何函数,这都是指全局对象,无论是在严格意义上 模式与否 console.logthis.document===document;//真的 //在web浏览器中,窗口对象也是全局对象: console.logthis==窗口;//真的 这个a=37;console.logwindow.a;//37函数中的函数上下文 函数,其值取决于函数的调用方式 简单呼叫
function f1(){ return this; }
f1() === window; // global object In this case, the value of this is
不是由呼叫设置的。由于代码未处于严格模式,因此
其中的一个对象必须始终是对象,因此它默认为全局对象
函数f2{use strict;//请参阅strict模式返回此;}
f2() === undefined;
在严格模式下,此值保持为
无论它在进入执行上下文时设置为什么。如果不是
已定义,但仍未定义。它也可以设置为任何值,例如
如空或42或我不是这个
注意:在第二个示例中,这应该是未定义的,因为f2是
调用时不提供任何基础,例如window.f2。此功能
在一些浏览器刚开始支持时没有实现
严格模式。结果,他们错误地返回了窗口对象。
作为对象方法
当函数作为对象的方法调用时,它的this设置为
调用该方法的对象
在下面的示例中,当调用o.f时,在函数内部
这是绑定到o对象的
var o = { prop: 37, f: function() {
return this.prop; } };
console.log(o.f()); // logs 37 Note that this behavior is not at all
受函数定义方式或位置的影响。在过去
例如,我们在
o的定义。然而,我们可以很容易地定义
函数先将其连接到o.f,然后再将其连接到o.f。这样做会导致
同样的行为:
var o = {prop: 37};
function independent() { return this.prop; }
o.f = independent;
console.log(o.f()); // logs 37 This demonstrates that it matters only
该函数是从o的f成员调用的
类似地,此绑定只受最直接的
成员参考。在下面的示例中,当我们调用
函数,我们将其称为对象o.b.的方法g
执行时,此函数内部将引用o.b.的事实
对象本身是o的成员,没有结果;最
直接参考才是最重要的
o.b = {g: independent, prop: 42}; console.log(o.b.g()); // logs 42
this on the object's prototype chain
同样的概念也适用于服务器上某处定义的方法
对象的原型链。如果方法在对象的原型上
链,这是指调用该方法的对象,就像
方法在对象上
var o = {f:function(){ return this.a + this.b; }}; var p =
Object.create(o); p.a = 1; p.b = 4;
console.log(p.f()); // 5 In this example, the object assigned to the
变量p没有自己的f属性,它从它的
原型但是查找f最终是否成功并不重要
在o上查找具有该名称的成员;查找开始时是对的引用
p、 函数中的这个取对象的值
称为p。也就是说,因为f被称为p的一种方法,它的
这是指p。这是JavaScript的一个有趣特性
原型继承
这需要一个getter或setter
同样,当函数从
盖特还是塞特。用作getter或setter的函数具有以下特性
绑定到从中设置或获取属性的对象
function modulus(){ return Math.sqrt(this.re * this.re + this.im *
this.im); }
var o = { re: 1, im: -1, get phase(){
return Math.atan2(this.im, this.re); } };
Object.defineProperty(o, 'modulus', {
get: modulus, enumerable:true, configurable:true});
console.log(o.phase, o.modulus); // logs -0.78 1.4142 As a constructor
当函数被用作具有new关键字的构造函数时,其
这将绑定到正在构造的新对象
注意:构造函数的默认值是返回对象
如果
返回值不是对象,则返回此对象的值
/**施工人员的工作方式如下:*
*函数MyConstructor{*
//实际函数体代码位于此处。*//在上创建属性
|这| as*//通过分配给它们来实现。例如,*this.fum=
nom;*//等等…**//如果函数有返回值
语句*//返回一个对象,该对象将是*
//| new |表达式的结果。否则,*//的结果
表达式是当前绑定到| this |*//
i、 例如,最常见的病例。*}*/
function C(){ this.a = 37; }
var o = new C(); console.log(o.a); // logs 37
function C2(){ this.a = 37; return {a:38}; }
o = new C2(); console.log(o.a); // logs 38 In the last example (C2),
由于在构造过程中返回了一个对象,因此新对象
这注定会被抛弃。这实质上是
声明如下:a=37;死代码。它还没死,因为
它会被执行,但可以在没有外部影响的情况下消除
打电话申请
如果函数在其正文中使用this关键字,则其值可以是
使用调用或应用绑定到调用中的特定对象
所有函数从Function.prototype继承的方法
function add(c, d){ return this.a + this.b + c + d; }
var o = {a:1, b:3};
//第一个参数是用作//“this”的对象,随后
参数在函数调用中作为//参数传递
add.callo,5,7;//1+3+5+7=16
//第一个参数是用作//“this”的对象,第二个参数是
是一个数组,其//成员用作函数中的参数
调用add.applyo[10,20];//1+3+10+20=34注意
调用并应用,如果作为非对象传递的值
将尝试使用内部命令将其转换为对象
ToObject操作。因此,如果传递的值是一个像7或
“foo”,将使用相关的
构造函数,因此原语7被转换为一个对象,就像
通过new Number7和字符串“foo”将对象视为通过new
字符串'foo',例如
function bar() { console.log(Object.prototype.toString.call(this));
}
bar.call(7); // [object Number] The bind method
ECMAScript 5引入了Function.prototype.bind。使命感
f、 bindsomeObject创建具有相同主体和作用域的新函数
作为f,但在原始函数中,在新函数中
函数将其永久绑定到bind的第一个参数,
无论函数是如何使用的
function f(){ return this.a; }
var g = f.bind({a:"azerty"}); console.log(g()); // azerty
var o = {a:37, f:f, g:g}; console.log(o.f(), o.g()); // 37, azerty As
DOM事件处理程序
当函数用作事件处理程序时,其this设置为
元素从某些浏览器触发的事件不遵循此
使用其他方法动态添加的侦听器的约定
附加的列表器
//作为侦听器调用时,将相关元素变为蓝色函数
bluifie{//Always true console.logthis==e.currentTarget;
//当currentTarget和target是同一对象时为true
console.logthis==e.target;this.style.backgroundColor=
“A5D9F3”;}
// Get a list of every element in the document var elements =
document.getElementsByTagName('*');
// Add bluify as a click listener so when the // element is clicked
开启时,当Var i=0时变为蓝色;我
元素[i]。addEventListener'click',bluify,false;}排队
事件处理程序
从内嵌处理程序调用代码时,其this设置为
放置侦听器的DOM元素:
展示这个
上述警报显示按钮。但是请注意,只有
外部代码的设置方式如下:
显示内心
在这种情况下,内部函数的this未设置为
返回全局/窗口对象,即中的默认对象
非严格模式,该模式不由调用设置
您正在设置局部变量var j=a;,当您使用this.a时,您试图访问此引用的对象的名为a的属性,两者都引用不同的值…浏览器中的此内部函数是窗口。“全局”只是指最外部范围的局部,在浏览器中是窗口。谢谢。Doh-是的,不应该使用这个,我只是过度使用了局部范围。