Как работает это в функции стрелок [duplicate]

для команды multiedit

multiedit [-n PATTERN] OLDSTRING NEWSTRING

Из ответа Каспара я сделал сценарий bash, чтобы принимать аргументы командной строки и, возможно, ограничивать имена файлов, соответствующие шаблону. Сохраните в своей $ PATH и выполните исполняемый файл, а затем просто используйте команду выше.

Вот сценарий:

#!/bin/bash
_help="\n
Replace OLDSTRING with NEWSTRING recursively starting from current directory\n
multiedit [-n PATTERN] OLDSTRING NEWSTRING\n

[-n PATTERN] option limits to filenames matching PATTERN\n
Note: backslash escape special characters\n
Note: enclose STRINGS with spaces in double quotes\n
Example to limit the edit to python files:\n
multiedit -n \*.py \"OLD STRING\" NEWSTRING\n"

# ensure correct number of arguments, otherwise display help...
if [ $# -lt 2 ] || [ $# -gt 4 ]; then echo -e $_help ; exit ; fi
if [ $1 == "-n" ]; then  # if -n option is given:
        # replace OLDSTRING with NEWSTRING recursively in files matching PATTERN
        find ./ -type f -name "$2" -exec sed -i "s/$3/$4/g" {} \;
else
        # replace OLDSTRING with NEWSTRING recursively in all files
        find ./ -type f -exec sed -i "s/$1/$2/" {} \;
fi
37
задан 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 внутри вашей функции стрелки будет иметь то же значение, что и раньше, перед назначением функции стрелки.

24
ответ дан dave 23 August 2018 в 01:08
поделиться
  • 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 23 August 2018 в 01:08
поделиться

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

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

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 23 August 2018 в 01:08
поделиться

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

// 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 23 August 2018 в 01:08
поделиться

Надеюсь, это показание кода может дать вам более четкую идею. В принципе, «это» в функции стрелок является текущей версией контекста «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 23 August 2018 в 01:08
поделиться
Другие вопросы по тегам:

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