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-是的,不应该使用这个,我只是过度使用了局部范围。