【发布时间】:2020-03-05 19:50:13
【问题描述】:
我在使用 dropzone 时发现了一些奇怪的东西:
这是我的掉落:
<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) {
我注意到我在 return 语句中的变量“new_file”的值为“123847123_Filename.ext” 但是,当我尝试使用该变量调用另一个方法或函数时,我收到 new_file 作为“Filename.ext”,失去了我的旧值。
在 google 上搜索我发现 javascript 与嵌套函数之间的名称参数有一些冲突。
有办法解决这个问题吗?我需要在多个函数/方法调用中使用我的旧值。
【问题讨论】:
-
没有
new_value可供两者使用,而只是将其设为本地?为什么你还需要它? -
不要在超出实际需要的范围内定义变量。永远不要使用
var(任何最新的 linter 都应该默认强制执行此操作)。避免在其他函数中定义复杂的函数(这个可能会引起争议,但它往往会导致这类泄漏范围问题)。 -
我知道,但这次是必需的,我需要使用函数“renameFile”使用日期时间将每个文件重命名为“unique_id”。稍后我需要使用该参数来使用 Dropozone 方法验证文件,就像大小或删除等一样。
-
@DanKanze - 这种推理方式同样适用于
goto。一个不犯错误的程序员可以使用var和let以同样的效率,但var范围错误是一个极端的common source of avoidable errors。let和const是块作用域,而不是函数作用域。如果你想将变量移动到块的顶部,很好,但是在它们的块范围之外定义它们也会导致很多潜在的错误。但是,这些是指导方针。总会有需要偏离“最佳实践”的情况。 -
@DanKanze "如果一个程序运行它就会运行" So does a burning bus
标签: javascript dropzone