Javascript как избежать конфликтов имен переменных в функциях? - PullRequest
0 голосов
/ 05 марта 2020

Я работал с Dropzone, и я заметил что-то странное:

Это мой Drop:

<script type="text/javascript">

var CountFiles = 0;


$(document).ready(function () {

    Dropzone.autoDiscover = false;

    var new_file;

    const Drop1 = new Dropzone("div#myPrincipalDropzone", {
        url: "/Article/UploadFiles",

        paramName: "file",
        maxFiles: 1,
        maxFilesize: 1200,
        maxFileHeight: 840,
        maxFileWidth: 840,
        acceptedFiles: ".png,.jpg",
        addRemoveLinks: true,
        parallelUploads: 1,
        renameFile: function (file) {
            let newname = new Date().getTime() + '_';
            console.log("Nombre en RenameFile:" + newname);
            file.name = newname;
            console.log("Asigno al file el nombre:" + file.name);
            new_file = new File([file], newname + file.name);
            console.log(new_file.name);
            return new_file;
        },

        init: function (new_file) {

Я заметил, что моя переменная "new_file" в операторе возврата имеет значение "123847123_Filename .ext "Однако, когда я пытаюсь вызвать другой метод или функцию, используя эту переменную, я получаю новый_файл как" Filename.ext ", теряя мое старое значение.

Поиск в Google обнаружил, что у javascript есть некоторые конфликты с именами параметров между вложенными функциями.

Есть способ это исправить? Мне нужно использовать мое старое значение в нескольких вызовах функций / методов.

1 Ответ

1 голос
/ 05 марта 2020

Редактировать 1: исправить путаницу между контекстом и областью действия

Редактировать 2: ссылки на цепочка областей действия и удалить область "параметров", поскольку такой вещи нет

Ну, причина, по которой она ведет себя так, в том, что замыкания

Функция имеет доступ к 2 вещам:

  1. Локальная область действия: переменные определены внутри функции и полученные параметры. Если они определены, они будут использоваться вместо переменных, доступных из родительской области.
  2. Родительская область: переменные определены в области, в которой функция была первоначально определена (часто ошибочно называемой «глобальной»). "контекст). См. Цепочки областей действия *

* Область действия функции является глобальной для функций, определенных внутри нее, поэтому область действия родителя включает область действия всех старших родителей, пока вы не достигнете глобальной scope.

Вот фрагмент, который вы можете использовать, чтобы увидеть несколько из множества различных случаев, которые показывают, как context - это все, когда дело доходит до «имени» переменной:


    const x = 'GLOBAL X VALUE';
    function A() {
      // A is referring to X within its own context
      console.log(`The value of x in A is => ${this.x}`);
      console.log(`The value of y in A is => ${this.y}`);
    }

    function B() {
      // B is referring to x within the context in which it was defined
      console.log(`The value of x in B is => ${x}`);
    }

    function C() {
      // C is referring to x within the context in which it was defined
      // That's why it also prints the value of the "global" context even if you
      // call it within a context that has a value with the same name
      console.log(`The value of x in C is => ${x}`);
    }

    function D(x) {
      console.log(`The value of x in D is => ${x}`);
      C();
    }

    function F() {
      // A is going to have access to the context of F, but it will not have access
      // to the global context
      this.y = "the other value";
      A.bind(this)();
      console.log(`The value of x in F is => ${x}`);
    }

    function G(x) {
      this.x = "HMMMM";
      console.log(`The value of local x in G is => ${this.x}`);
      console.log(`The value of param x in G is => ${x}`);
    }

    A(); // the value of x and y will be undefined
    B(); // the value of x will be the global context
    D("Parameter x value"); // the value of x will be the one passed as a parameter
    F();
    G("Parameter x value"); // the parameter and the local context are two different things

this* опасно только для go, возьмите эту документацию

...