Как javascript fat arrow vs normal function set `this`? [Дубликат]

Просто для полноты и потому, что я не видел, чтобы кто-либо еще предлагал это:

Перед тем, как применить какие-либо сложные предложения, рассмотрите вопрос о том, действительно ли SQL-инъекция является проблемой в вашем сценарии.

Во многих случаях значение, предоставляемое IN (...), представляет собой список идентификаторов, которые были сгенерированы таким образом, что вы можете быть уверены, что инъекция невозможна ... (например, результаты предыдущий select some_id from some_table, где some_condition.)

Если это так, вы можете просто связать это значение и не использовать службы или подготовленный оператор для него или использовать их для других параметров этого запроса.

query="select f1,f2 from t1 where f3=? and f2 in (" + sListOfIds + ");";
36
задан Felix Kling 10 October 2015 в 17:50
поделиться

5 ответов

Функции стрелок захватывают значение this вложенного контекста

function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| properly refers to the person object
  }, 1000);
}

var p = new Person();

Итак, чтобы напрямую ответить на ваш вопрос, this внутри вашей функции стрелки будет иметь то же значение, что и раньше, перед назначением функции стрелки.

23
ответ дан dave 15 August 2018 в 19:44
поделиться
  • 1
    @torazaburo запоздалый ответ - ответ зависит от того, где был размещен фрагмент кода в исходном вопросе. Если он находился на верхнем уровне, this является объектом window, если мы находимся в браузере и module.exports, если мы находимся в среде Node. Дело в том, что функция стрелки не имеет эффекта по значению this. – Aerovistae 18 May 2017 в 18:33
  • 2
    Комментарий от @dave, 'this внутри вашей функции стрелок будет иметь то же значение, что и раньше, до того, как была назначена функция стрелки' - это то, что, наконец, заставило меня щелкнуть. – Kevin 12 November 2017 в 08:41

Функция Arrow this указывает на окружающий родительский элемент в Es6, означает, что он не имеет видимости как анонимные функции в ES5 ...

Это очень полезный способ избежать присвоения var self этому, что широко используется в ES5 ...

Посмотрите на пример ниже, назначив функцию внутри объекта:

var checkThis = {
  normalFunction: function () { console.log(this); },
  arrowFunction: () => console.log(this)
};

checkThis.normalFunction(); //Object {}
checkThis.arrowFunction(); //Window {external: Object, chrome: Object, document: document, tmpDebug: "", j: 0…}
1
ответ дан Alireza 15 August 2018 в 19:44
поделиться

Чтобы представить большую картину, я собираюсь объяснить как динамическое, так и лексическое связывание.

Связывание динамического имени

this относится к объекту, . Это регулярно читаемое предложение на SO. Но это все еще только фраза, довольно абстрактная. Есть ли соответствующий шаблон кода для этого предложения?

Да, есть:

const o = {
  m() { console.log(this) }
}

// the important patterns: applying methods

o.m(); // logs o
o["m"](); // logs o

m - это метод, потому что он полагается на this. o.m() или o["m"]() означает m применяется к o. Эти шаблоны - это перевод Javascript на нашу знаменитую фразу.

Существует еще один важный шаблон кода, на который вы должны обратить внимание:

"use strict";

const o = {
  m() { console.log(this) }
}

// m is passed to f as a callback
function f(m) { m() }

// another important pattern: passing methods

f(o.m); // logs undefined
f(o["m"]); // logs undefined

Он очень похож на предыдущий шаблон, только скобки отсутствуют. Но последствия значительны: когда вы передаете m функции f, вы вытаскиваете m своего объекта / контекста o.

Лексическая (или статическая) привязка имени

Функции стрелок не имеют собственных this / super / arguments. Они наследуют их от родительской лексической области:

const toString = Object.prototype.toString;

const o = {
  foo: () => console.log("window", toString.call(this)),
      
  bar() {
    const baz = () => console.log("o", toString.call(this));
    baz();
  }
}

o.foo() // logs window [object Window]
o.bar() // logs o [object Object]

Помимо глобальной области (Window в браузерах) только функции способны сформировать область видимости в блоках Javascript (и {} в ES2015). Когда вызывается функция стрелки o.foo, нет никакой окружающей функции, из которой baz может наследовать ее this. Следовательно, он фиксирует привязку this глобальной области действия, привязанную к объекту Window.

Когда baz вызывается o.bar, функция стрелки окружена o.bar ( o.bar формирует родительскую лексическую область) и может наследовать привязку o.bar this. o.bar был вызван на o, и поэтому его this привязан к o.

11
ответ дан ftor 15 August 2018 в 19:44
поделиться

Вы можете попытаться понять это, следуя ниже

// whatever here it is, function or fat arrow or literally object declare
// in short, a pair of curly braces should be appeared here, eg:
function f() {
  // the 'this' here is the 'this' in fat arrow function below, they are
  // bind together right here
  // if 'this' is meaningful here, eg. this === awesomeObject is true
  console.log(this) // [object awesomeObject]
  let a = (...param) => {
    // 'this is meaningful here too.
    console.log(this) // [object awesomeObject]
}

, поэтому «это» в функции толстой стрелки не связано, означает, что вы не можете заставить что-либо связываться с этим «здесь». применить не будет, .call не будет, .bind не будет. 'this' в функции fat arrow привязывается, когда вы записываете текст кода в текстовом редакторе. «Это» в функции толстой стрелки здесь буквально значимо. Что ваш код писать здесь, в текстовом редакторе, то, что ваше приложение работает там в repl. То, что «это» связано с жирным заключением, никогда не изменится, если вы не измените его в текстовом редакторе. Извините за мой пул English ...

1
ответ дан Plasmatium 15 August 2018 в 19:44
поделиться

Надеюсь, это показание кода может дать вам более четкую идею. В принципе, «это» в функции стрелок является текущей версией контекста «this». Смотрите код:

// 'this' in normal function & arrow function
var this1 = {
    number: 123,
    logFunction: function () { console.log(this); },
    logArrow: () => console.log(this)
};
this1.logFunction(); // Object { number: 123}
this1.logArrow(); // Window 
1
ответ дан Xin 15 August 2018 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: