2016-03-08 96 views
0

我有一個使用gulp和babel的構建過程,但巴貝爾扔我這個奇怪的重複函數名稱遍佈我的應用程序。巴貝爾重複的函數名稱

在Chrome中的錯誤是:ReferenceError: changeScale is not defined

原始代碼:

changeScale = function(value) { 
    if (value >= 1000000) return value/1000000 + 'M'; 

    if (value >= 1000) return value/1000 + 'k'; 

    return value; 
}; 

後的代碼一飲而盡和巴貝爾:

changeScale = function changeScale(value) { 
    if (value >= 1000000) return value/1000000 + 'M'; 

    if (value >= 1000) return value/1000 + 'k'; 

    return value; 
}; 

注意複製功能的名稱?

我一飲而盡任務:

var gulp   = require('gulp'); 
var gutil  = require('gulp-util'); 
var bower  = require('bower'); 
var babel  = require("gulp-babel"); 
var concat  = require('gulp-concat'); 

gulp.task('js', function() { 
    gulp.src('./www/app/**/*.js') 
    .pipe(babel()) 
    .pipe(concat('app.js')).on('error', errorHandler) 
    .pipe(gulp.dest('./www/js/')); 
}); 

而且我.babelrc文件:{ "presets": ["es2015"] }

+1

它們並不奇怪,它們是ES6:分配給某事的所有匿名函數表達式都被命名。不,他們不是你錯誤的原因。告訴我們你試圖調用這個函數的地方,以及你在哪一行得到這個異常。 – Bergi

回答

4

您的代碼分配一個匿名函數一個叫changeScale變量,但沒有var關鍵字,你正在創建一個全球性的變量。 Babel的輸出可能設置爲使用ES5嚴格模式,該模式禁止在不使用關鍵字var的情況下定義全局變量,因此Chrome會拋出ReferenceError,因爲該變量從未被定義過。

您可以通過將代碼更改爲var changeScale =或通過將變量更改爲使用函數聲明function changeScale() {}來解決此問題。要麼工作正常,你可以閱讀有關差異here。另外,您在這裏看到的重複函數名稱並不是一個問題 - 將一個命名函數分配給一個變量是非常有效的,並且它可以更容易地調試代碼,因爲調試器能夠向您展示該名稱,而不是將其列爲匿名功能。

+0

謝謝!剛進入es6,仍然是一個noobie – Mathius17