2

例如,我有这个 JavaScript 函数:

function createCroppie() {
  var crop = new Croppie(document.getElementById('js-image-editor'), {
      enableExif: true,
      showZoomer: true,
      viewport: { width: y, height: y, type: 'square'},
      boundary: { width: x, height: x}
  });
}

现在我需要访问“crop”变量以在这些代码中使用:

  $('.fa-save').on('click', function (ev) {
       crop.result ({
        type: 'canvas',
        size: 'viewport'
      }).then(function () {
        console.log('upload image complete');
      });
    }); 

由于我在此处编写的第二个代码块不在同一个函数中,如何访问 createCroppie 函数中的“crop”变量?

4

2 回答 2

4

假设您在点击事件之前初始化 Croppie,您可以执行以下操作

var myCroppie;

function createCroppie() {
   myCroppie = new Croppie(document.getElementById('js-image-editor'), {
      enableExif: true,
      showZoomer: true,
      viewport: { width: y, height: y, type: 'square'},
      boundary: { width: x, height: x}
   });
}

 createCroppie();

 $('.fa-save').on('click', function (ev) {
     myCroppie.result ({
       type: 'canvas',
       size: 'viewport'
     }).then(function () {
        console.log('upload image complete');
     });
 }); 
于 2018-06-25T01:32:52.330 回答
0

除非使用闭包,否则函数变量的作用域是在函数内。正如 Senal 指出的,第一个解决方案是为变量使用全局范围。

使用闭包重写:

function createCroppie() {
  var crop = new Croppie(document.getElementById('js-image-editor'), {
      enableExif: true,
      showZoomer: true,
      viewport: { width: y, height: y, type: 'square'},
      boundary: { width: x, height: x}
  }
  return crop;
// or return this;
// this being the elements of the function as an object.
  );
}

crop = createCroppie();

查找 Croppie 文档,它基于创建一个闭包来返回一个带有变量的对象。无需围绕它包装函数。

var myCroppie = new Croppie(document.getElementById('js-image-editor'), {
          enableExif: true,
          showZoomer: true,
          viewport: { width: y, height: y, type: 'square'},
          boundary: { width: x, height: x}
      };

但是,您可以使用闭包来扩展库。

function createCroppie() {
  var crop = new Croppie(document.getElementById('js-image-editor'), {
      enableExif: true,
      showZoomer: true,
      viewport: { width: y, height: y, type: 'square'},
      boundary: { width: x, height: x}
  }
  function say(message) {
       console.log(message);
       return this;
  }
  return this;
  );
}

crop = createCroppie();

现在,crop 是一个带有 log 函数的新croppie,并且 this,(下面不是函数对象的元素)可以工作。

  $('.fa-save').on('click', function (ev) {
       crop.log('clicked').result ({
        type: 'canvas',
        size: 'viewport'
      }).then(function () {
        console.log('upload image complete');
      });
    }); 

注意,闭包函数的say函数需要返回“this”,(Javascript this),以便包含允许crop.log.result()存在的.result函数。

于 2018-06-25T02:32:52.800 回答