意外使用“自我”无限制全局变量

Posted

技术标签:

【中文标题】意外使用“自我”无限制全局变量【英文标题】:Unexpected use of 'self' no-restricted-globals 【发布时间】:2019-02-26 02:14:09 【问题描述】:

我正在创建一个 React 应用程序。该应用程序运行良好,但是当我包含以下 javascript 文件时,编译失败并且出现以下错误:

编译失败。

./src/recorder.js

第 1 行:'define' 未定义 no-undef

第 1 行:意外使用 'self' no-restricted-globals 第 1 行: 意外使用'self' no-restricted-globals 第 355 行:意外 使用 'self' no-restricted-globals 第 355 行:意外使用 'self' 无限制的全局变量

搜索关键字以了解有关每个错误的更多信息。L

我不太确定可能是什么问题,我已附上此文件的代码。

(function(f) 
    if (typeof exports === "object" && typeof module !== "undefined") 
        module.exports = f()
     else if (typeof define === "function" && define.amd) 
        define([], f)
     else 
        var g;
        if (typeof window !== "undefined") 
            g = window
         else if (typeof global !== "undefined") 
            g = global
         else if (typeof self !== "undefined") 
            g = self
         else 
            g = this
        
        g.Recorder = f()
    
)(function() 
    var define, module, exports;
    return (function e(t, n, r) 
        function s(o, u) 
            if (!n[o]) 
                if (!t[o]) 
                    var a = typeof require == "function" && require;
                    if (!u && a) return a(o, !0);
                    if (i) return i(o, !0);
                    var f = new Error("Cannot find module '" + o + "'");
                    throw f.code = "MODULE_NOT_FOUND", f
                
                var l = n[o] = 
                    exports: 
                ;
                t[o][0].call(l.exports, function(e) 
                    var n = t[o][1][e];
                    return s(n ? n : e)
                , l, l.exports, e, t, n, r)
            
            return n[o].exports
        
        var i = typeof require == "function" && require;
        for (var o = 0; o < r.length; o++) s(r[o]);
        return s
    )(
        1: [function(require, module, exports) 
            "use strict";

            module.exports = require("./recorder").Recorder;

        , 
            "./recorder": 2
        ],
        2: [function(require, module, exports) 
            'use strict';

            var _createClass = (function() 
                function defineProperties(target, props) 
                    for (var i = 0; i < props.length; i++) 
                        var descriptor = props[i];
                        descriptor.enumerable = descriptor.enumerable || false;
                        descriptor.configurable = true;
                        if ("value" in descriptor) descriptor.writable = true;
                        Object.defineProperty(target, descriptor.key, descriptor);
                    
                
                return function(Constructor, protoProps, staticProps) 
                    if (protoProps) defineProperties(Constructor.prototype, protoProps);
                    if (staticProps) defineProperties(Constructor, staticProps);
                    return Constructor;
                ;
            )();

            Object.defineProperty(exports, "__esModule", 
                value: true
            );
            exports.Recorder = undefined;

            var _inlineWorker = require('inline-worker');

            var _inlineWorker2 = _interopRequireDefault(_inlineWorker);

            function _interopRequireDefault(obj) 
                return obj && obj.__esModule ? obj : 
                    default: obj
                ;
            

            function _classCallCheck(instance, Constructor) 
                if (!(instance instanceof Constructor)) 
                    throw new TypeError("Cannot call a class as a function");
                
            

            var Recorder = exports.Recorder = (function() 
                function Recorder(source, cfg) 
                    var _this = this;

                    _classCallCheck(this, Recorder);

                    this.config = 
                        bufferLen: 4096,
                        numChannels: 1,
                        mimeType: 'audio/wav'
                    ;
                    this.recording = false;
                    this.callbacks = 
                        getBuffer: [],
                        exportWAV: []
                    ;

                    Object.assign(this.config, cfg);
                    this.context = source.context;
                    this.node = (this.context.createScriptProcessor || this.context.createJavaScriptNode).call(this.context, this.config.bufferLen, this.config.numChannels, this.config.numChannels);

                    this.node.onaudioprocess = function(e) 
                        if (!_this.recording) return;

                        var buffer = [];
                        for (var channel = 0; channel < _this.config.numChannels; channel++) 
                            buffer.push(e.inputBuffer.getChannelData(channel));
                        
                        _this.worker.postMessage(
                            command: 'record',
                            buffer: buffer
                        );
                    ;

                    source.connect(this.node);
                    this.node.connect(this.context.destination); //this should not be necessary

                    var self = ;
                    this.worker = new _inlineWorker2.default(function() 
                        var recLength = 0,
                            recBuffers = [],
                            sampleRate = undefined,
                            numChannels = undefined;

                        self.onmessage = function(e) 
                            switch (e.data.command) 
                                case 'init':
                                    init(e.data.config);
                                    break;
                                case 'record':
                                    record(e.data.buffer);
                                    break;
                                case 'exportWAV':
                                    exportWAV(e.data.type);
                                    break;
                                case 'getBuffer':
                                    getBuffer();
                                    break;
                                case 'clear':
                                    clear();
                                    break;
                            
                        ;

                        function init(config) 
                            sampleRate = config.sampleRate;
                            numChannels = config.numChannels;
                            initBuffers();
                        

                        function record(inputBuffer) 
                            for (var channel = 0; channel < numChannels; channel++) 
                                recBuffers[channel].push(inputBuffer[channel]);
                            
                            recLength += inputBuffer[0].length;
                        

                        function exportWAV(type) 
                            var buffers = [];
                            for (var channel = 0; channel < numChannels; channel++) 
                                buffers.push(mergeBuffers(recBuffers[channel], recLength));
                            
                            var interleaved = undefined;
                            if (numChannels === 2) 
                                interleaved = interleave(buffers[0], buffers[1]);
                             else 
                                interleaved = buffers[0];
                            
                            var dataview = encodeWAV(interleaved);
                            var audioBlob = new Blob([dataview], 
                                type: type
                            );

                            self.postMessage(
                                command: 'exportWAV',
                                data: audioBlob
                            );
                        

                        function getBuffer() 
                            var buffers = [];
                            for (var channel = 0; channel < numChannels; channel++) 
                                buffers.push(mergeBuffers(recBuffers[channel], recLength));
                            
                            self.postMessage(
                                command: 'getBuffer',
                                data: buffers
                            );
                        

                        function clear() 
                            recLength = 0;
                            recBuffers = [];
                            initBuffers();
                        

                        function initBuffers() 
                            for (var channel = 0; channel < numChannels; channel++) 
                                recBuffers[channel] = [];
                            
                        

                        function mergeBuffers(recBuffers, recLength) 
                            var result = new Float32Array(recLength);
                            var offset = 0;
                            for (var i = 0; i < recBuffers.length; i++) 
                                result.set(recBuffers[i], offset);
                                offset += recBuffers[i].length;
                            
                            return result;
                        

                        function interleave(inputL, inputR) 
                            var length = inputL.length + inputR.length;
                            var result = new Float32Array(length);

                            var index = 0,
                                inputIndex = 0;

                            while (index < length) 
                                result[index++] = inputL[inputIndex];
                                result[index++] = inputR[inputIndex];
                                inputIndex++;
                            
                            return result;
                        

                        function floatTo16BitPCM(output, offset, input) 
                            for (var i = 0; i < input.length; i++, offset += 2) 
                                var s = Math.max(-1, Math.min(1, input[i]));
                                output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
                            
                        

                        function writeString(view, offset, string) 
                            for (var i = 0; i < string.length; i++) 
                                view.setUint8(offset + i, string.charCodeAt(i));
                            
                        

                        function encodeWAV(samples) 
                            var buffer = new ArrayBuffer(44 + samples.length * 2);
                            var view = new DataView(buffer);

                            /* RIFF identifier */
                            writeString(view, 0, 'RIFF');
                            /* RIFF chunk length */
                            view.setUint32(4, 36 + samples.length * 2, true);
                            /* RIFF type */
                            writeString(view, 8, 'WAVE');
                            /* format chunk identifier */
                            writeString(view, 12, 'fmt ');
                            /* format chunk length */
                            view.setUint32(16, 16, true);
                            /* sample format (raw) */
                            view.setUint16(20, 1, true);
                            /* channel count */
                            view.setUint16(22, numChannels, true);
                            /* sample rate */
                            view.setUint32(24, sampleRate, true);
                            /* byte rate (sample rate * block align) */
                            view.setUint32(28, sampleRate * 4, true);
                            /* block align (channel count * bytes per sample) */
                            view.setUint16(32, numChannels * 2, true);
                            /* bits per sample */
                            view.setUint16(34, 16, true);
                            /* data chunk identifier */
                            writeString(view, 36, 'data');
                            /* data chunk length */
                            view.setUint32(40, samples.length * 2, true);

                            floatTo16BitPCM(view, 44, samples);

                            return view;
                        
                    , self);

                    this.worker.postMessage(
                        command: 'init',
                        config: 
                            sampleRate: this.context.sampleRate,
                            numChannels: this.config.numChannels
                        
                    );

                    this.worker.onmessage = function(e) 
                        var cb = _this.callbacks[e.data.command].pop();
                        if (typeof cb == 'function') 
                            cb(e.data.data);
                        
                    ;
                

                _createClass(Recorder, [
                    key: 'record',
                    value: function record() 
                        this.recording = true;
                    
                , 
                    key: 'stop',
                    value: function stop() 
                        this.recording = false;
                    
                , 
                    key: 'clear',
                    value: function clear() 
                        this.worker.postMessage(
                            command: 'clear'
                        );
                    
                , 
                    key: 'getBuffer',
                    value: function getBuffer(cb) 
                        cb = cb || this.config.callback;
                        if (!cb) throw new Error('Callback not set');

                        this.callbacks.getBuffer.push(cb);

                        this.worker.postMessage(
                            command: 'getBuffer'
                        );
                    
                , 
                    key: 'exportWAV',
                    value: function exportWAV(cb, mimeType) 
                        mimeType = mimeType || this.config.mimeType;
                        cb = cb || this.config.callback;
                        if (!cb) throw new Error('Callback not set');

                        this.callbacks.exportWAV.push(cb);

                        this.worker.postMessage(
                            command: 'exportWAV',
                            type: mimeType
                        );
                    
                ], [
                    key: 'forceDownload',
                    value: function forceDownload(blob, filename) 
                        var url = (window.URL || window.webkitURL).createObjectURL(blob);
                        var link = window.document.createElement('a');
                        link.href = url;
                        link.download = filename || 'output.wav';
                        var click = document.createEvent("Event");
                        click.initEvent("click", true, true);
                        link.dispatchEvent(click);
                    
                ]);

                return Recorder;
            )();

            exports.default = Recorder;

        , 
            "inline-worker": 3
        ],
        3: [function(require, module, exports) 
            "use strict";

            module.exports = require("./inline-worker");
        , 
            "./inline-worker": 4
        ],
        4: [function(require, module, exports) 
            (function(global) 
                "use strict";

                var _createClass = (function() 
                    function defineProperties(target, props) 
                        for (var key in props) 
                            var prop = props[key];
                            prop.configurable = true;
                            if (prop.value) prop.writable = true;
                        
                        Object.defineProperties(target, props);
                    
                    return function(Constructor, protoProps, staticProps) 
                        if (protoProps) defineProperties(Constructor.prototype, protoProps);
                        if (staticProps) defineProperties(Constructor, staticProps);
                        return Constructor;
                    ;
                )();

                var _classCallCheck = function(instance, Constructor) 
                    if (!(instance instanceof Constructor)) 
                        throw new TypeError("Cannot call a class as a function");
                    
                ;

                var WORKER_ENABLED = !!(global === global.window && global.URL && global.Blob && global.Worker);

                var InlineWorker = (function() 
                    function InlineWorker(func, self) 
                        var _this = this;

                        _classCallCheck(this, InlineWorker);

                        if (WORKER_ENABLED) 
                            var functionBody = func.toString().trim().match(/^function\s*\w*\s*\([\w\s,]*\)\s*([\w\W]*?)$/)[1];
                            var url = global.URL.createObjectURL(new global.Blob([functionBody], 
                                type: "text/javascript"
                            ));

                            return new global.Worker(url);
                        

                        this.self = self;
                        this.self.postMessage = function(data) 
                            setTimeout(function() 
                                _this.onmessage(
                                    data: data
                                );
                            , 0);
                        ;

                        setTimeout(function() 
                            func.call(self);
                        , 0);
                    

                    _createClass(InlineWorker, 
                        postMessage: 
                            value: function postMessage(data) 
                                var _this = this;

                                setTimeout(function() 
                                    _this.self.onmessage(
                                        data: data
                                    );
                                , 0);
                            
                        
                    );

                    return InlineWorker;
                )();

                module.exports = InlineWorker;
            ).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : )
        , ]
    , , [1])(1)
);

【问题讨论】:

尝试删除“使用严格” 这是编译器输出,因此并不意味着易于人类阅读。请改为发布原始源代码。 @LazarNikolic 这是 terrible 的建议......无论如何,正如我所说,这是编译器输出。下次编译项目时,任何更改都会被覆盖。 我已经删除了“使用严格”,但它仍然无法正常工作。 @JaredSmith 对不起,你是什么意思? 【参考方案1】:

当您将create-react-app 与本地 ESLint 版本一起使用时,通常会出现这些 linting 错误。不支持将本地 ESLint 版本与未弹出的 create-react-app 一起使用。

如果您删除本地 ESLint 包并尝试重新编译项目,您应该不会看到这些错误。

// First remove anything related to ESLint from package.json, then:
rm -rf node_modules
rm package-lock.json
npm install

使用create-react-app 设置的项目已经具有带有反应配置的 ESLint,它将进行基本检查 - 没有代码样式检查。 React 官方声明样式格式化程序 Prettier 是用于样式格式化的好工具 (source)。

【讨论】:

删除 eslint 不是解决办法,应该在 eslint 规则中列入白名单 @ShirshenduBhowmick 我不建议删除 ESLint,而是让 CRA 处理 linting,而不是包含两个冲突的版本。

以上是关于意外使用“自我”无限制全局变量的主要内容,如果未能解决你的问题,请参考以下文章

局部变量和全局变量

Python中的全局变量与局部变量的区别

JS内存泄露

php中在局部作用域内访问全局变量

局部静态变量只能初始化一次是怎么实现?

Python 局部变量与全局变量